假设我有两个矩阵A和B:
A: A1 A2 B: B1 B2
ROW1 V1 V2 ROW1 V3 V4
ROW2 V5 V6 ROW2 V7 V8
我希望得到一个结果矩阵R,它包括两个矩阵列中每对的乘积,如下所示:
R: A1_B1 A1_B2 A2_B1 A2_B2
ROW1 V1*V3 V1*V4 V2*V3 V2*V4
ROW2 V5*V7 V5*V8 V6*V7 V6*V8
循环结构可以做到,但我想知道是否有更好的选择。
答案 0 :(得分:5)
您可以使用apply
:
A <- matrix(1:4,2,2)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
B <- A * 10
# [,1] [,2]
# [1,] 10 30
# [2,] 20 40
matrix(apply(A, 2, "*", B), nrow = nrow(A))
# [,1] [,2] [,3] [,4]
# [1,] 10 30 30 90
# [2,] 40 80 80 160
Antti的补充:
这非常有用。最后,我需要这个来操纵data.frame
。为了为data.frame
应用有意义的列名,我做了以下操作:
将该矩阵设为data.frame:
R <- as.data.frame(R)
在A和B中生成列名的向量
Acol <- grep("A", names(data.frame(A)), value = T)
Bcol <- grep("B", names(data.frame(B)), value = T)
然后重命名R:
的列colnames(R) <- outer(Acol, Bcol, paste, sep = ".")
答案 1 :(得分:0)
首先让我们制作一些我们可以实际使用的真实数据:
> A=matrix(c(1,5,2,6),2,2)
> B=matrix(c(3,7,4,8),2,2)
> A
[,1] [,2]
[1,] 1 2
[2,] 5 6
> B
[,1] [,2]
[1,] 3 4
[2,] 7 8
现在的问题是简单地将A和B的右列组合相乘。这些组合分别是A1,A1,A2,A2次(分别)B1 B2 B1 B2 - 我们可以从expand.grid
获得这些组合:
> cols = as.matrix(expand.grid(1:2,1:2))
> cols
Var1 Var2
[1,] 1 1
[2,] 2 1
[3,] 1 2
[4,] 2 2
然后我们将其列为A和B的列(按其他顺序):
> A[,cols[,2]] * B[,cols[,1]]
[,1] [,2] [,3] [,4]
[1,] 3 4 6 8
[2,] 35 40 42 48
QED
[请注意我是如何仔细构建A和B以匹配您的V值的,所以你可以看到你有V6 * V8的地方我有6 * 8]
答案 2 :(得分:0)
A <- matrix(1:4,2,2)
B <- A * 10
cbind(A[,1]*B, A[,2]*B)
[,1] [,2] [,3] [,4]
[1,] 10 30 30 90
[2,] 40 80 80 160