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 是除以零时的正确答案。 @Alex NaN 没问题,但我认为Inf-Inf 会更合适输出(当然取决于股息的符号)。 @EitanT 0/0 怎么样?通常除以零是未定义的。此外,无穷大不是实数。我们也可以使用 NaN。 khanacademy.org/math/trigonometry/functions_and_graphs/… @Alex 0/0 确实是NaN,但这是一个例外。 Inf 至少包含有关符号的信息,并且在分子有限的分数中作为分母时也允许结果为零。显然Inf 在 MATLAB 中是一个未定义的数字,但是当数字趋于无穷大时,它允许相当基本的极限演算,并且有时确实有一个定义的结果。 @EitanT 是的+Inf-InfNaN 比一般NaN 有更多信息。我的意思是当你除以零时,0 永远不是正确答案。 【参考方案1】:

您的基于循环的方法是执行矩阵除法,即每次迭代的结果是sigmaT(:,:,i) 的逆矩阵。您可以使用 ./ 运算符(而不是 /)调整循环以执行每个元素的数学运算。

您基于bsxfun 的方法是执行每个元素的除法,即每个单独的元素都被反转。无法使用bsxfun 对包含在 3D 数组中的每个 2D 矩阵执行矩阵运算。

这些答案非常不同。您应该使用适合您的问题的任何方法。两者的性能差异可能比较小。

【讨论】:

以上是关于Matlab - 矩阵除以零 - 零和 NaN的主要内容,如果未能解决你的问题,请参考以下文章

查找投影矩阵以创建零和向量

处理零和缺失数据的Python非负矩阵分解?

MATLAB:在矩阵中插入不同数量的 NaN

在MATLAB中,如何找出矩阵的非零元素。并且输出它所在的行和列。只要非零就为真。输出1。。

在Matlab中用NaN取矩阵的平均值[重复]

matlab怎么把元素替换成NAN