BeauchampLab:VibrationMatlabCode

From OpenWetWare
Jump to navigationJump to search
% MATLAB code for finding best fit. As before, you could probably find a more elegant way to do this.  Or, you could copy and 
paste and move on with your day. ;-)


% R = ratio to fit
% X_grad = G(:,1); 
% G=scaled gradients, column-wise X Y Z 

a_ind=0;
b_ind=0;

if mean(R(abs(X_grad)>800)) > mean(R(abs(X_grad)<300))+std(R(abs(X_grad)<300))
   t_flip=1;
else
   t_flip=0;
end

clear err_ss
for a= 0:.001:1  %.  <--- I found this to be pretty quick, but you can 
                 % nonetheless start wide with a range of something like
                 % 0:.1:1 and focus in after a few runs. 

   a_ind=a_ind+1;
   a_keep(a_ind) = a;
   b_ind=0;
   
   for b=0:.01:15  % <--- same.
       b_ind=b_ind+1;
       b_keep(b_ind) = b;

       for ind=1:length(R);
           if abs(X_grad(ind)) < 1000*a
               t(ind)= 1;
           elseif abs(X_grad(ind)) <= 1000*(a+b);
               t(ind)=  cos(((abs(X_grad(ind)/1000)-a)*pi)/(2*b))^2; 
           else
               t(ind)=0;
           end
       end
       
       if t_flip==1;
           t=2-t;
       end
             
       err_ss(a_ind,b_ind)=sum(sqrt((R-t').^2));
       
   end
end
     
close all

% imagesc(1-err_ss);
[i,j]=find(err_ss ==min(min(err_ss))); 

a=a_keep(i);
b=b_keep(j);

% disp(['a=' num2str(a_keep(i))])
% disp(['b=' num2str(b_keep(j))])

a=a_keep(i); b=b_keep(j);
for ind=1:length(R);
   if abs(X_grad(ind)) < 1000*a
       t(ind)= 1;
   elseif abs(X_grad(ind)) <= 1000*(a+b);
       t(ind)=  cos(((abs(X_grad(ind)/1000)-a)*pi)/(2*b))^2; 
   else
       t(ind)=0;
   end
end

if t_flip==1;
   t=2-t;
end


       
%  figure; 
%  g_nice=sortrows([X_grad, t']);
%  plot(X_grad, R, 'o'); 
%  hold on
%  plot(g_nice(:,1), g_nice(:,2), '--')

%  fid=fopen('tukey_correction.txt', 'w');
%  
%  % print out tukey correction values, add in b=0 volumes.  We're going to
%  % apply this to the DMC-corrected DWI.nii 
% 
clear tukey_correction
b0=[1 11 21 31 41 51 61 71];
t_ind=1;
for full_ind=1:79;
   if max(full_ind==b0)==1
       fprintf(fid, '1\n');
%      tukey_correction(full_ind)=1;
   else
       fprintf(fid, '%.4f\n', t(t_ind));
%      tukey_correction(full_ind) = t(t_ind);
       t_ind=t_ind+1;
   end
end