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