【问题标题】:Sums of Kronecker products of elements of one list with elements from another list in RR中一个列表的元素与另一个列表中的元素的克罗内克积之和
【发布时间】:2020-06-15 05:41:58
【问题描述】:

我不知道如何解释我想要做的事情,以便从谷歌搜索中给出有意义的答案。出于这个原因,我也不确定这个问题的最佳命名方式,所以如果标题不清楚,我很抱歉。

假设我有两个名为aB 的矩阵列表。 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 循环。

任何帮助将不胜感激。

【问题讨论】:

    标签: r list


    【解决方案1】:

    以下代码概括了克罗内克乘积的总和,然后拆分结果。

    原代码是

    lst <- lapply(seq_along(a), function(i) kronecker(a[[i]], B[[i]]))
    res <- Reduce(`+`, lst)
    

    但是跟随用户G. Grothendieckcomment,这可以写成

    res <- Reduce("+", Map(kronecker, a, B))
    

    然后,拆分结果矩阵。

    split.data.frame(res, rep(seq_along(a[[1]]), each = length(a)))
    #$`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
    

    现在不再需要临时列表lst

    rm(lst)    # final clean-up
    

    最后一点,split.data.frame 方法必须被显式调用。来自?split的文档,详细部分,我的重点:

    split 和 split数据框法也可用于将矩阵拆分为 矩阵列表,以及同样的替换形式,前提是它们 被显式调用。

    如果使用默认方法,矩阵将像向量一样被分割,dim 属性将被删除。

    【讨论】:

    • 前两行可以写成Reduce("+", Map(kronecker, a, B))
    • @G.Grothendieck 谢谢,我忘了Map。已编辑。
    • @RuiBarradas - 非常感谢您的回答。我刚刚意识到输出不正确。输出应该包含三个元素,每个元素应该是一个 2x2 矩阵。
    • @SOULed_Outt length(seq_along(a))length(a) 返回相同的值,因为 seq_along 将连续索引返回到 a(与 a 的元素一样多)。
    • @SOULed_Outt 完成,立即查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2020-06-22
    • 2019-08-31
    相关资源
    最近更新 更多