【问题标题】:Matrix multiplication with scattered NA values具有分散 NA 值的矩阵乘法
【发布时间】:2013-05-14 04:23:42
【问题描述】:

我希望在 R 中将两个矩阵相乘,其中一个矩阵可能包含随机放置的 NA 值(即,它们没有理由都在一行或一列中),但我仍然想要一个像示例一样的输出下面:

Matrix 1
[1,]      33        45    50
[2,]       NA       NA    54

Matrix 2
[1,] A1               0.0000000        0.0000000
[2,] 0.0000000        A2               0.0000000
[3,] 0.0000000        0.0000000           A3


Result
[1,]      33*A1     45*A2          50*A3
[2,]       NA       NA        (NA*0 +NA*0 +54*A3)=54*A3

仅仅做 Matrix1%*%Matrix2 并没有给出我想要的第 2 行第 3 列中的元素(它给出了 NA,这是有道理的,但不确定如何做我想做的事情) .出于我的目的,矩阵 2 永远不会有 NA 值,如果这有任何改变的话。

【问题讨论】:

  • 我期待找到一个 inner 函数来匹配 R 的 outer 函数,让您可以像这样编写自己的自定义操作。哦,好吧,它似乎不存在。我想知道为什么。

标签: r matrix multiplication na


【解决方案1】:

将所有出现的NA改为0,然后进行矩阵乘法:

x <- matrix(c(33, 45, 50, NA, NA, 54), nrow=2, byrow=TRUE)
y <- diag(1:3)


x[is.na(x)] <- 0

x %*% y
     [,1] [,2] [,3]
[1,]   33   90  150
[2,]    0    0  162

【讨论】:

  • 唯一的技巧是将结果中的 2 个 0 转换为 NA。就我而言,区别在于 exp(0)=1,而 exp(NA)=NA。在对数刻度上操作时,我使用 NA 表示“无”。
【解决方案2】:

扩展上一个答案及其评论:您可以将输入矩阵的 NA 模式应用于输出矩阵。

这仅在输入和输出矩阵具有相同维度时才有效。

x <- matrix(c(33, 45, 50, NA, NA, 54), nrow=2, byrow=TRUE)
y <- diag(1:3)

x0 <- x
x0[is.na(x)] <- 0

z <- x0 %*% y

z[is.na(x)] <- NA

z
     [,1] [,2] [,3]
[1,]   33   90  150
[2,]   NA   NA  162

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 2012-12-19
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多