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 if nargin<2; w=[]; end
0019
0020 if isempty(x); error('empty x'); end
0021
0022 if ndims(x)==4;
0023 if nargin>1; error('weights not supported for 4D data'); end
0024 [m,n,o,p]=size(x);
0025 y=zeros(size(x));
0026 N=zeros(1,n);
0027 for k=1:p
0028 [y(:,:,:,k),NN]=nt_normcol(x(:,:,:,k));
0029 N=N+NN.^2;
0030 end
0031 return
0032 end
0033
0034 if ndims(x)==3;
0035
0036
0037 [m,n,o]=size(x);
0038 x=nt_unfold(x);
0039 if isempty(w);
0040
0041 [y,NN]=nt_normcol(x);
0042 N=NN.^2;
0043 y=nt_fold(y,m);
0044 else
0045
0046 if size(w,1)~=m; error('weight matrix should have same nrows as data'); end
0047 if ndims(w)==2 && size(w,2)==1;
0048 w=repmat(w,[1,m,o]);
0049 end
0050 if size(w)~=size(w); error('weight should have same size as data'); end
0051 w=nt_unfold(w);
0052 [y,NN]=nt_normcol(x,w);
0053 N=NN.^2;
0054 y=nt_fold(y,m);
0055 end
0056
0057 else
0058
0059
0060 [m,n]=size(x);
0061 if isempty(w)
0062
0063
0064
0065
0066 N=(sum(x.^2)/m);
0067 NN=N.^-0.5;
0068 NN(find(N==0))=0;
0069 y=nt_vecmult(x,NN);
0070
0071 else
0072
0073
0074 if size(w,1)~=size(x,1); error('weight matrix should have same ncols as data'); end
0075 if ndims(w)==2 && size(w,2)==1;
0076 w=repmat(w,1,n);
0077 end
0078 if size(w)~=size(w); error('weight should have same size as data'); end
0079 if size(w,2)==1; w=repmat(w,1,n);end
0080
0081
0082 N=(sum((x.^2).*w)./sum(w));
0083 NN=N.^-0.5;
0084 NN(find(N==0))=0;
0085 y=nt_vecmult(x, NN);
0086
0087 end
0088 end
0089
0090 norm=N.^0.5;