我遇到以下问题 - 我的矩阵A
大小为16x22440。
我需要做的是规范化这个矩阵的每一行,使每个矩阵的范数等于1(for n=1:16 norm(A(n,:))==1
)
如何在matlab中实现这一目标?
编辑: 此矩阵中的每一行都是由160x140图像创建的矢量,因此必须单独考虑。需要对值进行归一化以创建特征脸矩阵。
答案 0 :(得分:3)
首先,计算规范(我假设这里是Eucleadian规范)
n = sqrt( sum( A.^2, 2 ) );
% patch to overcome rows with zero norm
n( n == 0 ) = 1;
nA = bsxfun( @rdivide, A, n ); % divide by norm
答案 1 :(得分:3)
您的Matlab安装是否包含神经网络工具箱?如果是,请尝试normr
:
nA = normr(A);
否则,@Shai's solution是好的,除了它不会处理无限或NaN
输入 - 之后检查未定义的范数情况更安全:
nA = bsxfun(@rdivide,A,sqrt(sum(A.^2,2)));
nA(~isfinite(nA)) = 1; % Use 0 to match output of @Shai's solution, Matlab's norm()
请注意,对零长度(所有零组件)或无限长度向量(一个或多个组件+Inf
或-Inf
)或具有NaN
组件的组件进行标准化并不是很好-defined。上面的解决方案返回所有的解决方案,就像Matlab的normr
函数一样。然而,Matlab的norm
函数表现出不同的行为。您可能希望指定不同的行为,例如,警告或错误,全部为零,NaN,按向量长度缩放的组件等。此线程在一定程度上讨论了零长度向量的问题:How do you normalize a zero vector?