Matlab - 矩阵除以零 - 零和 NaN
Posted
技术标签:
【中文标题】Matlab - 矩阵除以零 - 零和 NaN【英文标题】:Matlab - Matrix Division by Zero - Zeros and NaNs 【发布时间】:2013-03-20 13:58:13 【问题描述】:我正在尝试将精度矩阵 sigmaT 转换为协方差矩阵。我尝试了两种方法:
covMat = zeros(size(sigmaT));
for i=1:t
covMat(:, :, i) = eye(D)/sigmaT(:,:,i);
end
和
covMat = bsxfun(@rdivide, eye(D), sigmaT);
sigmaT 中的某些元素为零,因此会发生除以零。第一种基于循环的解决方案将发生被 0 除的元素保留为 0,第二种方法将元素设置为 NaN。
我的问题是:为什么它们的行为不同,我如何才能将第二种单行方法更改为基于循环的方法?我相信后一种解决方案在大型矩阵上应该更快。
【问题讨论】:
NaN 是除以零时的正确答案。 @AlexNaN
没问题,但我认为Inf
或-Inf
会更合适输出(当然取决于股息的符号)。
@EitanT 0/0 怎么样?通常除以零是未定义的。此外,无穷大不是实数。我们也可以使用 NaN。 khanacademy.org/math/trigonometry/functions_and_graphs/…
@Alex 0/0 确实是NaN
,但这是一个例外。 Inf
至少包含有关符号的信息,并且在分子有限的分数中作为分母时也允许结果为零。显然Inf
在 MATLAB 中是一个未定义的数字,但是当数字趋于无穷大时,它允许相当基本的极限演算,并且有时确实有一个定义的结果。
@EitanT 是的+Inf
、-Inf
和NaN
比一般NaN
有更多信息。我的意思是当你除以零时,0
永远不是正确答案。
【参考方案1】:
您的基于循环的方法是执行矩阵除法,即每次迭代的结果是sigmaT(:,:,i)
的逆矩阵。您可以使用 ./
运算符(而不是 /
)调整循环以执行每个元素的数学运算。
您基于bsxfun
的方法是执行每个元素的除法,即每个单独的元素都被反转。无法使用bsxfun
对包含在 3D 数组中的每个 2D 矩阵执行矩阵运算。
这些答案非常不同。您应该使用适合您的问题的任何方法。两者的性能差异可能比较小。
【讨论】:
以上是关于Matlab - 矩阵除以零 - 零和 NaN的主要内容,如果未能解决你的问题,请参考以下文章