首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列Wise [R]矩阵乘法

列Wise [R]矩阵乘法
EN

Stack Overflow用户
提问于 2015-11-11 18:57:02
回答 3查看 1.6K关注 0票数 3

注:我指的不是矩阵乘法,就像在here中一样--即使是在另一篇文章中讨论的转置的扭曲。

我有这两个矩阵。

矩阵A

代码语言:javascript
复制
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

代码语言:javascript
复制
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码:

代码语言:javascript
复制
       [,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的列执行相同的操作。

我没有设置任何特定类型的对象(列表、矩阵、数组)作为输出。

问题是:如何将这两个矩阵按元素和列相乘,最终得到另一个矩阵或一个“列表”对象或数组?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-11 19:06:19

您可以尝试以下几种方法:

代码语言:javascript
复制
> 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

关于以下评论中的后续问题,如果您的最终目标是每个子矩阵的列和,您可以通过以下方法实现这一点:

代码语言:javascript
复制
> 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
票数 7
EN

Stack Overflow用户

发布于 2015-11-11 19:09:09

不确定最后是否需要数组或列表。如果是数组,则可以使用apply进行一些整形。

代码语言:javascript
复制
array(apply(A, 2, function(x) x*B), c(3,3,4))
# OR array(apply(A, 2, `*`, B), c(3,3,4))
票数 4
EN

Stack Overflow用户

发布于 2015-11-11 19:11:19

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33657834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档