【问题标题】:Basic R: Multiplying elements in 3-D array with loop基本 R:使用循环将 3-D 数组中的元素相乘
【发布时间】:2012-09-12 02:25:34
【问题描述】:

我有两个 3-D 数组,AB,每个 2 x 3 x 3。下面显示的示例(这将有助于阐明我想要乘)。

 A1   A2   A3                             B1   B2   B3  
 A4   A5   A6                             B4   B5   B6

 A7   A8   A9                             B7   B8   B9
 A10  A11  A12                            B10  B11  B12

 A13  A14  A15                            B13  B14  B15
 A16  A17  A18                            B16  B17  B18

我想要做的是创建一个矩阵,其中 3 个 A 矩阵被平均,并且某个位置的值由相应的 B 值加权...I不好解释,但是比如第一个元素是:

[(A1*B1)+(A7*B7)+(A13*B13)] / sum(B1,B7,B13).

另一个元素是:

[(A5*B5)+(A11*B11)+(A17*B17)] / sum(B5,B11,B17).

等等...结果是一个 2 x 3 矩阵。我一直在玩嵌套 for 循环的不同组合,下面显示了一个示例,但我还没有弄清楚如何正确地做到这一点......感谢帮助。

for (j in 1:2){
     for (k in 1:3){
          ans[j*k]=sum(A[j,k,1:3]*B[j,k,1:3])/sum(B[j,k,1:3])
     }
}

【问题讨论】:

    标签: arrays r linear-algebra vectorization matrix-multiplication


    【解决方案1】:

    你可以这样做:

    apply(A * B, c(1,2), sum) / apply(B, c(1,2), sum)
    

    【讨论】:

    • @chriscolose,我很乐意提供帮助。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受;您可以按照stackoverflow.com/faq#howtoask 的说明进行操作。
    【解决方案2】:

    我只是重写你的表达方式:

    for (j in 1:2){
         for (k in 1:3){
              ans[j,k]= dotProduct(A[k,j],B[k,j])/sum(B[k,j])
         }
    }
    

    【讨论】:

    • @flodel 的解决方案更符合“最佳实践”R。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多