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

时间:2019-07-06 09:40:23

标签: r matrix interaction

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

有聪明的方法吗?

2 个答案:

答案 0 :(得分:3)

我最终做了

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

答案 1 :(得分:1)

在此示例中,您可以

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