【发布时间】:2020-06-15 05:41:58
【问题描述】:
我不知道如何解释我想要做的事情,以便从谷歌搜索中给出有意义的答案。出于这个原因,我也不确定这个问题的最佳命名方式,所以如果标题不清楚,我很抱歉。
假设我有两个名为a 和B 的矩阵列表。 a 是列矩阵的列表,大小相同。 B 是一个方阵列表,大小相同。每个列表具有相同的长度。
> a <- list( t(t(c(1,2,3))), t(t(c(-2,1,2))) )
> a
[[1]]
[,1]
[1,] 1
[2,] 2
[3,] 3
[[2]]
[,1]
[1,] -2
[2,] 1
[3,] 2
> B <- list( diag(2), diag(c(1,3)) )
> B
[[1]]
[,1] [,2]
[1,] 1 0
[2,] 0 1
[[2]]
[,1] [,2]
[1,] 1 0
[2,] 0 3
我的目标是生成一个新列表,比如C,其中第一个元素是由
a[[1]][1]*B[[1]] + a[[2]][1]*B[[2]],第二个元素是一个由
a[[1]][2]*B[[1]] + a[[2]][2]*B[[2]],第三个元素是由
a[[1]][3]*B[[1]] + a[[2]][3]*B[[2]]。列表C 的长度等于a 中列矩阵的长度。所以在这个例子中,C 应该是一个长度为 3 的列表。
这看起来像是克罗内克产品的总和(因此我的标题)所以我尝试过
kronecker(a[[1]], B[[1]]) + kronecker(a[[2]], B[[2]])
[,1] [,2]
[1,] -1 0
[2,] 0 -5
[3,] 3 0
[4,] 0 5
[5,] 5 0
[6,] 0 9
这给出了一个包含正确数字的矩阵,但结果不是一个列表。我认为这不是问题,因为我应该能够将输出转换为所需的列表。问题是当a 中的列矩阵的长度为 10 或 100 时,我不确定如何对其进行概括。
解决方案我创建了一个 for 循环。
C <- list()
for (i in 1:length(a[[1]])) {
C[[i]] = a[[1]][i]*B[[1]] + a[[2]][i]*B[[2]]
}
> C
[[1]]
[,1] [,2]
[1,] -1 0
[2,] 0 -5
[[2]]
[,1] [,2]
[1,] 3 0
[2,] 0 5
[[3]]
[,1] [,2]
[1,] 5 0
[2,] 0 9
这正是我想要的这个特定示例,但我也不确定如何推广这个 for 循环。
任何帮助将不胜感激。
【问题讨论】: