如何在嵌套列表中操作矩阵?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在嵌套列表中操作矩阵?相关的知识,希望对你有一定的参考价值。

我是使用嵌套列表的新手。那么,让我们假设我的数据有以下内容 dput:

mat_lag <- list(structure(list(V1 = 3:7, V2 = 11:15, V3 = 19:23), row.names = c(NA, 
-5L), class = "data.frame"), structure(list(V1 = 2:6, V2 = 10:14, 
V3 = 18:22), row.names = c(NA, -5L), class = "data.frame"), 
structure(list(V1 = 1:5, V2 = 9:13, V3 = 17:21), row.names = c(NA, 
-5L), class = "data.frame"))

PHI <- list(list(structure(1:9, .Dim = c(3L, 3L)), structure(1:9, .Dim = c(3L, 
3L)), structure(1:9, .Dim = c(3L, 3L))), list(structure(1:9, .Dim = c(3L, 
3L)), structure(1:9, .Dim = c(3L, 3L)), structure(1:9, .Dim = c(3L, 
3L))))

我的想法是将3个矩阵复用在 mat_lag 嵌套列表中的3个矩阵。PHI. 我的问题是,我不知道如何操作嵌套列表,我只能为一个嵌套列表编程。

让我更好地解释一下。我正在寻找一个逐条乘法的程序。

如果我使用的是 PHI[[1]] 代码将是以下内容。

Product <- lapply(1:length(mat_lag), function(index)
  mapply(function(x, y) x*y, t(PHI[[1]][[index]]), mat_lag[[index]]))

而结果将是如下。

[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    3   44  133    6   55  152    9   66  171
[2,]    4   48  140    8   60  160   12   72  180
[3,]    5   52  147   10   65  168   15   78  189
[4,]    6   56  154   12   70  176   18   84  198
[5,]    7   60  161   14   75  184   21   90  207

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    2   40  126    4   50  144    6   60  162
[2,]    3   44  133    6   55  152    9   66  171
[3,]    4   48  140    8   60  160   12   72  180
[4,]    5   52  147   10   65  168   15   78  189
[5,]    6   56  154   12   70  176   18   84  198

[[3]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1   36  119    2   45  136    3   54  153
[2,]    2   40  126    4   50  144    6   60  162
[3,]    3   44  133    6   55  152    9   66  171
[4,]    4   48  140    8   60  160   12   72  180
[5,]    5   52  147   10   65  168   15   78  189

我想重复这个操作,当 PHI变化,这意味着我想使用 PHI[[1]]PHI[[2]].

我想,我可以使用一个 for 循环 function 但我用的是 function 用于在我的代码中定义索引。

答案

有很多方法可以实现你所追求的东西。(我猜你想要的是矩阵乘法 %*% 而不是逐项乘法 *. 这里我将使用tcrossprod)这里有2个选项。

多重for循环

result1 <- vector('list', 3)
for(i in 1:3){
  result1[[i]] <- vector('list', 3)
  for(j in 1:2){
    result1[[i]][[j]] <- tcrossprod(PHI[[j]][[i]], mat_lag[[i]])
  }
}

嵌套函数(循环隐藏)。

result2 <- lapply(1:3, function(x)lapply(1:2, function(z){
  tcrossprod(PHI[[z]][[x]], mat_lag[[x]])
}))

两者都使用指数来迭代列表。我们几乎可以用 mapply

result3 <- lapply(1:2, function(x)mapply(function(x, y) tcrossprod(x, y), x = PHI[[x]], y = mat_lag))

但这是以一个大矩阵输出的方式返回结果(并对结果进行转置),所以还需要做一些进一步的格式化处理。

另一答案
Product <- lapply(1:length(PHI), function(index)
  lapply(1:length(mat_lag), function(z)
    mapply(function(x, y) x*y, t(PHI[[index]][[z]]), mat_lag[[index]])
    ))

以上是关于如何在嵌套列表中操作矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

在没有库的情况下制作矩阵/在列表中没有任何内容的情况下插入嵌套列表

如何在片段中填充列表视图?

Android 嵌套片段方法

按行名过滤矩阵的嵌套列表

来自嵌套单词列表的共现矩阵

在R中取消嵌套纬度/经度坐标的嵌套列表?