Matlab矩阵乘法忽略nans?

Posted

技术标签:

【中文标题】Matlab矩阵乘法忽略nans?【英文标题】:Matlab Matrix multiplication ignoring nans? 【发布时间】:2012-12-20 04:08:27 【问题描述】:

我有两个矩阵AB 想要相乘,但它们包含nans。

默认乘法将nan 放在结果的整个列中,其中数据中甚至有一个nan。我想忽略它们,例如nansum/nanmean 等。换句话说,而不是计算

 sum( A(i,j) * B(j,k) )

我希望它使用nansum

我想这可以通过将nan 替换为0,然后相乘,但使用nansum 的目的是避免这种情况,对吧?

【问题讨论】:

【参考方案1】:

乘法导致NaNs 的原因是没有一种真正的方法可以处理它们。如果在您的情况下,它们应该被替换为零,那么最容易编写

A(isnan(A)) = 0;

在运行乘法之前。我建议不要重写矩阵乘法,因为您不会从自己的代码中获得与内置矩阵代数相似的性能。

nansum,尤其是nanmean 等是统计工具箱的函数,其中NaNs 不是简单地被零替换,而是实际上从计算中删除,因为在统计上下文中,NaN 是用于指示缺失的数据点。那里没有nanmult,因为在统计中,您不经常进行矩阵乘法,如果您这样做(例如在回归中),向量中缺少一个观察值通常意味着您想要抛出无论如何,整个行/列。

【讨论】:

+1:但是,如果完全替换 NaNs,我会考虑在 乘以矩阵之后替换它们。这至少允许识别结果中不依赖缺失值的元素。话又说回来,这一切都取决于一个人想要实现什么。 谢谢大家,点了;忽略 nan 是特定于案例的需要。我试图将eig(nancov(X))' 乘以X 来估计一个带有PCA 的矩阵,除了X 包含缺失值。我认为在这种情况下,nan-->0 有意义吗?【参考方案2】:
import numpy as np

#find the dimensions of your arrays
sza=a.shape
szb=b.shape

#calculate by using nested loops rows of 'a' times columns of 'b'
c=np.zeros(sza[0],szb[1])
for i in range(0, sza[0]):
  for k in range(0, szb[1]):
    c[i, k]=np.nansum(a[i, ]*b[:, k])

【讨论】:

python 未在问题中标记 能否解释一下为什么您的解决方案可以提高您贡献的价值? 矩阵乘法的基本思想是将矩阵 A[sza[0], sza[1]] 的行乘以 B[szb[0], szb[1] 的列的乘积相加]],其中 sza[1] = szb[0]。在我的嵌套循环格式中,我针对 A 的每一行遍历 B 的每一列。我找到产品并且只对产生实数的产品求和(例如 1*nan=nan 因此这将被忽略而不是添加)我将和输入到已在适当维度(sza[0]、szb[1])中定义的矩阵 c 中。

以上是关于Matlab矩阵乘法忽略nans?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:GPU上矩阵乘法(NaN)的错误结果

使用 Mac osx Accelerate 框架的矩阵乘法结果为 NaN

matlab用for循环求矩阵乘法

矩阵乘法在numpy/matlab/数学上的不同

Matlab忽略矩阵中的NaN

矩阵乘法运行时间 Python < C++ < Matlab - 解释