我有以下问题 - 我有一个A
大小为 16x22440 的矩阵。
我需要做的是对该矩阵的每一行进行归一化,使它们中的每一个的范数都等于 1 ( for n=1:16 norm(A(n,:))==1
)
我怎样才能在matlab中实现这一点?
编辑:此矩阵中的每一行都是由 160x140 图像创建的向量,因此必须单独考虑。需要对这些值进行归一化以创建特征面矩阵。
我有以下问题 - 我有一个A
大小为 16x22440 的矩阵。
我需要做的是对该矩阵的每一行进行归一化,使它们中的每一个的范数都等于 1 ( for n=1:16 norm(A(n,:))==1
)
我怎样才能在matlab中实现这一点?
编辑:此矩阵中的每一行都是由 160x140 图像创建的向量,因此必须单独考虑。需要对这些值进行归一化以创建特征面矩阵。
首先,计算范数(我在这里假设欧几里德范数)
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
您安装的 Matlab 是否包含神经网络工具箱?如果是这样,请尝试normr
:
nA = normr(A);
否则,@Shai 的解决方案很好,只是它不会处理无限或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
函数一样。norm
然而,Matlab 的函数表现出不同的行为。您可能希望指定不同的行为,例如警告或错误、全零、NaN、按向量长度缩放的分量等。此线程在一定程度上讨论了零长度向量的问题:How do you normalize a零向量?.