将矩阵的每一行与另一个矩阵中的同一行进行交互
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)]
在 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)]