Matlab矩阵乘法忽略nans?
Posted
技术标签:
【中文标题】Matlab矩阵乘法忽略nans?【英文标题】:Matlab Matrix multiplication ignoring nans? 【发布时间】:2012-12-20 04:08:27 【问题描述】:我有两个矩阵A
和B
想要相乘,但它们包含nan
s。
默认乘法将nan
放在结果的整个列中,其中数据中甚至有一个nan
。我想忽略它们,例如nansum
/nanmean
等。换句话说,而不是计算
sum( A(i,j) * B(j,k) )
我希望它使用nansum
。
我想这可以通过将nan
替换为0
,然后相乘,但使用nansum
的目的是避免这种情况,对吧?
【问题讨论】:
【参考方案1】:乘法导致NaN
s 的原因是没有一种真正的方法可以处理它们。如果在您的情况下,它们应该被替换为零,那么最容易编写
A(isnan(A)) = 0;
在运行乘法之前。我建议不要重写矩阵乘法,因为您不会从自己的代码中获得与内置矩阵代数相似的性能。
nansum
,尤其是nanmean
等是统计工具箱的函数,其中NaN
s 不是简单地被零替换,而是实际上从计算中删除,因为在统计上下文中,NaN
是用于指示缺失的数据点。那里没有nanmult
,因为在统计中,您不经常进行矩阵乘法,如果您这样做(例如在回归中),向量中缺少一个观察值通常意味着您想要抛出无论如何,整个行/列。
【讨论】:
+1:但是,如果完全替换NaN
s,我会考虑在 乘以矩阵之后替换它们。这至少允许识别结果中不依赖缺失值的元素。话又说回来,这一切都取决于一个人想要实现什么。
谢谢大家,点了;忽略 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?的主要内容,如果未能解决你的问题,请参考以下文章