Взаимодействовать каждую строку матрицы с той же строкой в ​​другой матрице - PullRequest
2 голосов
/ 06 июля 2019

В R у меня есть две матрицы X и Z, и я хотел бы матрица W такая, что строка (i) из W содержит строку (i) из X, взаимодействующую со строкой (i) из Z.

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 ]

3 голосов
/ 06 июля 2019

Я закончил делать

X[,sort(rep(1:J,K))] * Z[,rep(1:K,J)]
1 голос
/ 06 июля 2019

Для этого примера вы можете сделать

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
...