注:我指的不是矩阵乘法,就像在here中一样--即使是在另一篇文章中讨论的转置的扭曲。
我有这两个矩阵。
矩阵A
A <- matrix(c(1,1,1,-1,1,1,1,-1,1,-1,-1,1), ncol=4)
[,1] [,2] [,3] [,4]
[1,] 1 -1 1 -1
[2,] 1 1 -1 -1
[3,] 1 1 1 1 B矩阵...and
B <- matrix(c(1,2,3,2,1,3,2,3,1), ncol=3)
[,1] [,2] [,3]
[1,] 1 2 2
[2,] 2 1 3
[3,] 3 3 1 我想得到R码:
[,1] [,2] [,3]
[1,] 1*1 1*2 1*2
[2,] 1*2 1*1 1*3
[3,] 1*3 1*3 1*1
[,1] [,2] [,3]
[1,] -1*1 -1*2 -1*2
[2,] 1*2 1*1 1*3
[3,] 1*3 1*3 1*1
[,1] [,2] [,3]
[1,] 1*1 1*2 1*2
[2,] -1*2 -1*1 -1*3
[3,] 1*3 1*3 1*1
[,1] [,2] [,3]
[1,] -1*1 -1*2 -1*2
[2,] -1*2 -1*1 -1*3
[3,] 1*3 1*3 1*1 它不是线性代数乘法,因为乘法结束时没有和。这不是克罗内克的产品。我尝试过使用apply(A, 2, function(x) A * B,但是它不起作用,因为虽然我可以指定一次只需要一个A的列,但我不知道如何对B的列执行相同的操作。
我没有设置任何特定类型的对象(列表、矩阵、数组)作为输出。
问题是:如何将这两个矩阵按元素和列相乘,最终得到另一个矩阵或一个“列表”对象或数组?
发布于 2015-11-11 19:06:19
您可以尝试以下几种方法:
> lapply(as.data.frame(A), `*`, B)
$V1
[,1] [,2] [,3]
[1,] 1 2 2
[2,] 2 1 3
[3,] 3 3 1
$V2
[,1] [,2] [,3]
[1,] -1 -2 -2
[2,] 2 1 3
[3,] 3 3 1
$V3
[,1] [,2] [,3]
[1,] 1 2 2
[2,] -2 -1 -3
[3,] 3 3 1
$V4
[,1] [,2] [,3]
[1,] -1 -2 -2
[2,] -2 -1 -3
[3,] 3 3 1关于以下评论中的后续问题,如果您的最终目标是每个子矩阵的列和,您可以通过以下方法实现这一点:
> lapply(as.data.frame(A), function(x) colSums(x * B))
$V1
[1] 6 6 6
$V2
[1] 4 2 2
$V3
[1] 2 4 0
$V4
[1] 0 0 -4发布于 2015-11-11 19:09:09
不确定最后是否需要数组或列表。如果是数组,则可以使用apply进行一些整形。
array(apply(A, 2, function(x) x*B), c(3,3,4))
# OR array(apply(A, 2, `*`, B), c(3,3,4))发布于 2015-11-11 19:11:19
A <- matrix(c(1,1,1, -1,1,1, 1,-1,1, -1,-1,1), 3)
B <- matrix(c(1,2,3, 2,1,3, 2,3,1), 3)
C <- array(NA, c(3,3,4))
for(i in 1:4) C[,,i] <- B*A[,i]https://stackoverflow.com/questions/33657834
复制相似问题