将矩阵的每一行与另一个矩阵中的同一行进行交互

Interact each row of matrix with same row in another matrix

在 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]
            }
        }
    }

有什么巧妙的方法吗?

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

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

我最后做了

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