【问题标题】:Interact each row of matrix with same row in another matrix将矩阵的每一行与另一个矩阵中的同一行交互
【发布时间】:2019-07-06 09:40:23
【问题描述】:

在 R 中,我有两个矩阵 X 和 Z,我想要一个 矩阵 W 使得 W 的第 (i) 行包含 X 的第 (i) 行与 Z 的第 (i) 行交互。

W(i) = X(i1)Z(i1) ... X(iJ)Z(i1) ... X(i1)Z(iK) ... X(iJ)Z(iK) 

这是一个做我想做的小规模的例子:

set.seed(1)
n <- 3
K <- 2
J <- 3
X <- matrix(rnorm(J*n),ncol=J)
Z <- matrix(rnorm(K*n),ncol=K)

W <- matrix(NA,nrow=n,ncol=K*J)

for (i in 1:n)
    {
    for (k in 1:K)
        {
        for (j in 1:J)
            {
                 W[i,j + J*(k-1)] <- X[i,j] * Z[i,k]
            }
        }
    }

有没有聪明的方法来做到这一点?

【问题讨论】:

  • 为什么投反对票?问题是否不清楚,或者您只知道之前已经回答过?如果是这样,最好投票以重复关闭。
  • 不是我的反对票,但如果您可以包含一个具有所需输出的玩具示例会更有帮助。
  • 当然,但是帖子中的代码只是一个玩具示例。该示例实现了我想要的,并且由于 set.seed() 应该是可复制的。如果您对如何改进该示例有任何建议,我会全力以赴。
  • 您提供的代码和示例数据没有说明正在做什么。交互这个词相当宽泛。虽然人们可以从上面的代码中理解你想要做什么,但最好用文字(也)准确地解释你想要做什么或者更好,复制和数据当前的样子以及进行操作时会发生什么。 至少这是我的看法。

标签: r matrix interaction


【解决方案1】:

我最终做了

X[,sort(rep(1:J,K))] * Z[,rep(1:K,J)]

【讨论】:

    【解决方案2】:

    对于这个例子,你可以这样做

    cbind(X * Z[, 1], X * Z[, 2])
    
    #          [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
    #[1,]  0.1913117 -0.4871802 -0.1488552  0.3891785 -0.9910532 -0.3028107
    #[2,]  0.2776285  0.4981436  1.1161854 -0.4067148 -0.7297608 -1.6351676
    #[3,] -0.3257642 -0.3198541  0.2244645 -0.9400245 -0.9229703  0.6477142
    

    或者更一般地说,我们可以将apply 用于更多列。

    W[] <- apply(Z, 2, function(x) X * x)
    

    它提供与运行循环后得到的W 相同的输出。

    W
    #           [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
    #[1,]  0.1913117 -0.4871802 -0.1488552  0.3891785 -0.9910532 -0.3028107
    #[2,]  0.2776285  0.4981436  1.1161854 -0.4067148 -0.7297608 -1.6351676
    #[3,] -0.3257642 -0.3198541  0.2244645 -0.9400245 -0.9229703  0.6477142
    

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多