我有以下的问题 - 我有大小16x22440的矩阵A
。正火行,使得它们的范数是等于1(MATLAB)
我需要做的是规范这个矩阵的每一行,让他们每个人的标准是等于1(for n=1:16 norm(A(n,:))==1
)
我怎样才能做到这一点在MATLAB?
编辑: 在该矩阵中的每一行是一个160x140图像的创建的矢量,因此必须单独考虑。这些值需要进行归一化以创建一个特征脸矩阵。
我有以下的问题 - 我有大小16x22440的矩阵A
。正火行,使得它们的范数是等于1(MATLAB)
我需要做的是规范这个矩阵的每一行,让他们每个人的标准是等于1(for n=1:16 norm(A(n,:))==1
)
我怎样才能做到这一点在MATLAB?
编辑: 在该矩阵中的每一行是一个160x140图像的创建的矢量,因此必须单独考虑。这些值需要进行归一化以创建一个特征脸矩阵。
请问您的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
组分的归一化是不是真的明确定义。上面的解决方案返回所有的,就像Matlab的normr
函数一样。然而,Matlab的norm
函数表现出不同的行为。你可能想指定一个不同的行为,例如,警告或错误,全零,NaN的,通过矢量长度缩放部件等,这螺纹讨论该问题对于零长度向量在一定程度上:How do you normalize a zero vector?。
谢谢,很高兴能够找到简单的方法来做到这一点! – Jacka 2013-05-12 18:58:09
首先,计算标准(我假设这里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
好了,用你的代码后,每行的规范是〜0,而不是1: 8.6903e-05; 1.3841e-04 1.6891e-04 2.0224e-04; 3.5168e-04; 4.0101e-04 5.7108e-04; 6.3513e-04; 6.6574e-04; 8.1582e-04; 8.5704e-04; 8.7563e-04; 0.0010; 0.0012; 0.0015; 0.0017; – Jacka 2013-05-12 15:16:45
@Jacka忘了采取规范'sqrt'。看看我的修补程序现在是否有效 – Shai 2013-05-12 16:07:10
是的,现在它可以工作,非常感谢! – Jacka 2013-05-12 16:15:53
什么'norm'? L2? L1? – Shai 2013-05-12 14:39:46
就是这种情况。 – Jacka 2013-05-12 14:52:58
那么我的回答应该对你有用。 – Shai 2013-05-12 14:53:36