[FieldTrip] help with inverse computing

Ludwing Torres lumatobu2 at hotmail.com
Fri Jan 28 04:52:09 CET 2011


Hello, I have the next script that computes the forward model of the brain activity:
 
clear all 
close all
clc
% load electrodes positions
elec = [];
load electrodes1020
% array of electrode positions
i_elec=[4 6 18 19 21 23 25 27 28 31 33 35 37 40 41 43 45 47 49 50 53 55 57 59 62 63 65 67 69 71 72 84 86];
% load concentric spheres or bem 
load standard_vol.mat
% vol.cond = [1 1/80 1];
% load spheric_vol_162.mat

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
cfg = [];
cfg.vol = vol; 
% cfg.elec = elec;
cfg.elec.pnt = elec.pnt(i_elec,1:3);
cfg.elec.label = elec.label(i_elec);
fs=250;
ns=250;
cfg.fsample = fs; 
time = (1:ns)/fs; 
signal1 = 1*sin(2*time*6*pi);
signal2 = 1*cos(2*time*12*pi);
signal3 = 1*cos(2*time*8*pi);

% head model
[vols, sens, cfg] = prepare_headmodel(cfg, []);

dipin=[];
 
[x,y,z]=meshgrid(linspace(-40,40,4), linspace(-40,40,4), linspace(0,30,3) );
dipin.pos=[x(:) y(:) z(:)];
mom_t=zeros(3*length(dipin.pos),ns);
 
x_orig=mom_t;
n_orig=mom_t;
n_orig(20,:)=signal1;
n_orig(80,:)=signal2;
n_orig(40,:)=signal3;
a11=1.2;
b11=0.05;
M11=3*length(dipin.pos);
A = a11*diag(ones(M11,1)) + b11*(diag(ones(M11-1,1),1) + diag(ones(M11-1,1),-1));
b12=0;
b13=0;
c11=-0.9;
for b=1:ns,
if b==1,
x_orig(:,b)=n_orig(:,b);
end
if b==2,
x_orig(:,b)=A*x_orig(:,b-1)+b12*x_orig(:,b-1).^2-b13*x_orig(:,b-1).^3+n_orig(:,b);
end
if b>2,
x_orig(:,b)=A*x_orig(:,b-1)+b12*x_orig(:,b-1).^2+b13*x_orig(:,b-1).^3+c11*x_orig(:,b-2)+n_orig(:,b);
end
end
C=compute_leadfield(dipin.pos, sens, vols);
dat=C*x_orig;
 
now I have to compute the inverse model, that is, I have to obtain the x_orig data, knowing only the data stored in dat and C.
For that, I made the next script (After runing the previous) In which I use different functions of FieldTrip to recover the x data:
 
 
 
[vol1,sens1]=prepare_vol_sens(vol, sens);
inside=inside_vol(dipin.pos,vol1); 
 
%After that I get 48 dipoles inside and 0 outside
dipin.outside=[];
dipin.inside=1:48;

 
%Inverse computing using MNE
dipout=minimumnormestimate(dipin,sens1,vol1,dat); 
 

% I store the dipole moments obtained as a matrix
Xres=[];
for ii=1:48
Xres=[Xres;dipout.mom{ii}];
end
 
% I compute a relative error between the original x and the obtained x to compare

error1=norm(Xres-x_orig,'fro')/norm(x_orig,'fro')
 

%Using Residual variance
[dipout2] = residualvariance(dipin, sens1, vol1, dat);

Xres2=[];
for ii=1:48
Xres2=[Xres2;dipout2.mom{ii}];
end

error2=norm(Xres2-x_orig,'fro')/norm(x_orig,'fro')
 


%Using dipole fitting
[dipout4] = dipole_fit(dipin, sens1, vol1, dat)

error4=norm(dipout4.mom-x_orig,'fro')/norm(x_orig,'fro')
 
The error obtained using residual variance is very different to the error of the two other methods.
Besides, I get a very big error (92%) with the other two methods.
I don't know if I'm doing something wrong, please If anyone could help me, I could pay you.
Thanks
 
C=compute_leadfield(dipin.pos, sens, vols);
dat=C*x_orig; 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20110127/4e39e4ff/attachment.html>


More information about the fieldtrip mailing list