Matlab - 由零划分的矩阵 - 零和NaN

时间:2013-03-20 13:58:13

标签: matlab matrix bsxfun

我正在尝试将精度矩阵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。

我的问题是:为什么它们的行为不同?我如何改变第二种单线方法来表现为基于循环的方法?我相信后一种解决方案在大型矩阵上应该明显更快。

1 个答案:

答案 0 :(得分:0)

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

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

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