12345678910111213141516171819202122232425262728293031323334353637383940 |
- function [edges,weights] = spm_vb_edgeweights(vxyz,img)
- % Compute edge set and edge weights of a graph
- % FORMAT [edges,weights]= spm_vb_edgeweights(vxyz,img)
- %
- % vxyz list of neighbouring voxels (see spm_vb_neighbors)
- % img image defined on the node set, e.g. wk_ols. The edge weights
- % are uniform if this is not given, otherwise they are a function
- % of the distance in physical space and that between the image
- % at neighoring nodes
- % edges [Ne x 2] list of neighboring voxel indices
- % weights [Ne x 1] list of edge weights
- % Ne number of edges (cardinality of edges set)
- % N number of nodes (cardinality of node set)
- %__________________________________________________________________________
- % Copyright (C) 2008-2014 Wellcome Trust Centre for Neuroimaging
- % Lee Harrison
- % $Id: spm_vb_edgeweights.m 6079 2014-06-30 18:25:37Z spm $
- N = size(vxyz,1);
- [r,c,v] = find(vxyz');
- edges = [c,v];
- % undirected graph, so only need store upper [lower] triangle
- i = find(edges(:,2) > edges(:,1));
- edges = edges(i,:);
- if nargin < 2,
- weights = ones(size(edges,1),1);
- return
- else
- ka = 16;
- M = mean(img,2)*ones(1,N);
- C = (1/N)*(img-M)*(img-M)';
- Hf = inv(C);
- A = spm_vb_incidence(edges,N);
- dB = img*A'; % spatial gradients of ols estimates
- dg2 = sum((dB'*Hf).*dB',2); % squared norm of spatial gradient of regressors
- ds2 = 1 + dg2; % squared distance in space is 1 as use only nearest neighbors
- weights = exp(-ds2/ka); % edge weights
- end
|