将向量列表乘以向量名称为条件的不同矩阵

时间:2019-06-08 20:05:12

标签: arrays r list matrix matrix-multiplication

我有一个20个长度向量的列表,我想根据长度向量的名称将每个长度乘以三个矩阵之一。这是我失败的尝试。请提出我如何改进代码的建议。任何帮助深表感谢!

for (i in 1:length(List)){
  .$Value=ifelse(names(List) %in% c("a","b","c"),matrixA%*%.$Value,ifelse(names(List) %in% c("d","e"),matrixB%*%.$Value, matrixC%*%.$Value))
}

我的列表的一部分和矩阵包括在下面。

list(a = structure(c(3, 0, 0, 5, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 1, 1), .Dim = c(20L, 1L)), b = structure(c(2, 
0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 6, 0), .Dim = c(20L, 
1L)))

matrixA <- diag(2,20)
matrixB <- diag(1,20)
matrixC <- diag(4,20)

2 个答案:

答案 0 :(得分:1)

可能对您有帮助

nm1 <- paste0("matrix", toupper(names(lst1)))
Map(crossprod, lst1, mget(nm1))

答案 1 :(得分:0)

所以...不确定我是否理解。但是,如果列表名称为 a,b或c ,那么您想将其乘以 matrixA ,如果您想要的是 d或e 将其乘以 matrixB ,如果两者都不乘,则应将值乘以 matrixC

让我们使用您的示例。

zz <- list(a = structure(c(3, 0, 0, 5, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 1, 1), .Dim = c(20L, 1L)), b = structure(c(2, 
0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 6, 0), .Dim = c(20L, 
1L)))

matrixA <- diag(2,20)
matrixB <- diag(1,20)
matrixC <- diag(4,20)

这可能不是最佳解决方案,但这是一个简单的解决方案。我只是对您的思想进行了一些调整,使其可以正常工作,在内的一个矩阵需要受 list()保护(因为列表是一个向量,ifelse可以使用向量) ifelse()否则,您只会得到第一个元素。这将为您返回结果列表。

results <- lapply(seq_along(zz), function(i){
    ifelse(names(zz[i]) %in% c("a","b","c"),list(matrixA%*%zz[[i]]),
            ifelse(names(zz[i]) %in% c("d","e"), list(matrixB%*%zz[[i]]), list(matrixC%*%zz[[i]])))
})

我用lapply将序列(对zz的长度为1)应用于定义的函数。对于每个 i ,函数都会查看 i 元素的名称​​ zz (zz [i]返回列表元素的名称),然后如果满足条件,我们将 zz i 元素的内容相乘(zz [[i]]只是返回 i 的内容列表中的元素(没有其名称))。

这也有效,您无需使用list()来保护矩阵。

results <- lapply(seq_along(zz), function(i){

    if(names(zz[i]) %in% c("a","b","c")) matrixA%*%zz[[i]] else 
    if(names(zz[i]) %in% c("d","e")) matrixB%*%zz[[i]]
    else matrixC%*%zz[[i]]

})

编辑:@akrun答案更漂亮,更简短。