2013-05-12 51 views
4

我有以下的问题 - 我有大小16x22440的矩阵A正火行,使得它们的范数是等于1(MATLAB)

我需要做的是规范这个矩阵的每一行,让他们每个人的标准是等于1(for n=1:16 norm(A(n,:))==1

我怎样才能做到这一点在MATLAB?

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

+0

什么'norm'? L2? L1? – Shai 2013-05-12 14:39:46

+0

就是这种情况。 – Jacka 2013-05-12 14:52:58

+0

那么我的回答应该对你有用。 – Shai 2013-05-12 14:53:36

回答

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组分的归一化是不是真的明确定义。上面的解决方案返回所有的,就像Matlab的normr函数一样。然而,Matlab的norm函数表现出不同的行为。你可能想指定一个不同的行为,例如,警告或错误,全零,NaN的,通过矢量长度缩放部件等,这螺纹讨论该问题对于零长度向量在一定程度上:How do you normalize a zero vector?

+0

谢谢,很高兴能够找到简单的方法来做到这一点! – Jacka 2013-05-12 18:58:09

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

好了,用你的代码后,每行的规范是〜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

+1

@Jacka忘了采取规范'sqrt'。看看我的修补程序现在是否有效 – Shai 2013-05-12 16:07:10

+2

是的,现在它可以工作,非常感谢! – Jacka 2013-05-12 16:15:53

相关问题