0001 function [y,norm]=nt_normcol(x,w)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 if nargin<2; w=[]; end
0021
0022 if isempty(x); error('empty x'); end
0023
0024 if iscell(x)
0025 if nargin>1; error('weights not supported for cell array'); end
0026 disp('warning: normalizing each cell individually');
0027 y={};
0028 for iCell=1:numel(x);
0029 y{iCell}=nt_normcol(x{iCell});
0030 end
0031 return
0032 end
0033
0034 if ndims(x)==4;
0035 if nargin>1; error('weights not supported for 4D data'); end
0036 [m,n,o,p]=size(x);
0037 y=zeros(size(x));
0038 N=zeros(1,n);
0039 for k=1:p
0040 [y(:,:,:,k),NN]=nt_normcol(x(:,:,:,k));
0041 N=N+NN.^2;
0042 end
0043 return
0044 end
0045
0046 if ndims(x)==3;
0047
0048
0049 [m,n,o]=size(x);
0050 x=nt_unfold(x);
0051 if isempty(w);
0052
0053 [y,NN]=nt_normcol(x);
0054 N=NN.^2;
0055 y=nt_fold(y,m);
0056 else
0057
0058 if size(w,1)~=m; error('weight matrix should have same nrows as data'); end
0059 if ndims(w)==2 && size(w,2)==1;
0060 w=repmat(w,[1,m,o]);
0061 end
0062 if size(w)~=size(w); error('weight should have same size as data'); end
0063 w=nt_unfold(w);
0064 [y,NN]=nt_normcol(x,w);
0065 N=NN.^2;
0066 y=nt_fold(y,m);
0067 end
0068
0069 else
0070
0071
0072 [m,n]=size(x);
0073 if isempty(w)
0074
0075
0076
0077
0078 N=(sum(x.^2)/m);
0079 NN=N.^-0.5;
0080 NN(find(N==0))=0;
0081 y=nt_vecmult(x,NN);
0082
0083 else
0084
0085
0086 if size(w,1)~=size(x,1); error('weight matrix should have same ncols as data'); end
0087 if ndims(w)==2 && size(w,2)==1;
0088 w=repmat(w,1,n);
0089 end
0090 if size(w)~=size(w); error('weight should have same size as data'); end
0091 if size(w,2)==1; w=repmat(w,1,n);end
0092
0093
0094 N=(sum((x.^2).*w)./sum(w));
0095 NN=N.^-0.5;
0096 NN(find(N==0))=0;
0097 y=nt_vecmult(x, NN);
0098
0099 end
0100 end
0101
0102 norm=N.^0.5;
0103