0001 function [AA,BB,RR,iBest]=nt_cca_crossvalidate(xx,yy,shifts,ncomp,A0,B0)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 if nargin<5
0019 A0=[]; B0=[];
0020 end
0021 if nargin<4; ncomp=[]; end
0022 if nargin<3 || isempty (shifts); shifts=[0]; end
0023 if nargin<2; error('!'); end
0024 if ~iscell(xx) || ~iscell(yy); error('!'); end
0025 if length(xx) ~= length (yy); error('!'); end
0026 if size(xx{1},1) ~= size(yy{1},1); error('!'); end
0027
0028 nTrials=length(xx);
0029
0030 if isempty(A0)
0031
0032 n=size(xx{1},2)+size(yy{1},2);
0033 C=zeros(n,n,length(shifts),nTrials);
0034 disp('Calculate all covariances...'); tic;
0035 nt_whoss;
0036 for iTrial=1:nTrials
0037 C(:,:,:,iTrial)=nt_cov_lags(xx{iTrial}, yy{iTrial},shifts);
0038 end
0039
0040
0041 disp('Calculate CCAs...'); tic;
0042 for iTrial=1:nTrials
0043 CC=sum(C(:,:,:,setdiff(1:nTrials,iTrial)),4);
0044 [A,B,R]=nt_cca([],[],[],CC,size(xx{1},2));
0045 AA{iTrial}=A;
0046 BB{iTrial}=B;
0047 end
0048 clear C CC
0049 toc;
0050 else
0051
0052 for iTrial=1:nTrials
0053 AA{iTrial}=A0;
0054 BB{iTrial}=B0;
0055 end
0056 end
0057
0058
0059
0060 disp('Calculate cross-correlations...'); tic;
0061 for iShift=1:length(shifts)
0062 xxx={}; yyy={};
0063
0064 for iTrial=1:nTrials
0065 [xxx{iTrial},yyy{iTrial}]=nt_relshift(xx{iTrial},yy{iTrial},shifts(iShift));
0066 xxx{iTrial}=nt_normcol( nt_demean( nt_mmat(xxx{iTrial},AA{iTrial}(:,:,iShift)) ) );
0067 yyy{iTrial}=nt_normcol( nt_demean( nt_mmat(yyy{iTrial},BB{iTrial}(:,:,iShift)) ) );
0068 end
0069 for iTrial=1:nTrials
0070 x=xxx{iTrial};
0071 y=yyy{iTrial};
0072 RR(:,iShift,iTrial)=diag(x'*y) / size(x,1);
0073 end
0074 end
0075 toc;
0076
0077 if isempty(ncomp); ncomp=size(RR,1); end
0078 [~,iBest]=max(mean(mean(RR(1:ncomp,:,:),3),1)');
0079
0080 disp('done');
0081