规范化矩阵行,使其范数等于1(MATLAB)

时间:2013-05-12 14:34:36

标签: matlab normalization norm

我遇到以下问题 - 我的矩阵A大小为16x22440。

我需要做的是规范化这个矩阵的每一行,使每个矩阵的范数等于1(for n=1:16 norm(A(n,:))==1

如何在matlab中实现这一目标?

编辑: 此矩阵中的每一行都是由160x140图像创建的矢量,因此必须单独考虑。需要对值进行归一化以创建特征脸矩阵。

2 个答案:

答案 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?