2015-11-11 124 views
3

注意:我不是指在here中的矩陣乘法 - 即使在另一篇文章討論過的轉置的扭曲。Column Wise [R]矩陣乘法


我有這兩個矩陣...

矩陣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

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列執行相同的操作。

我沒有設置任何特定類型的對象(列表,矩陣,數組)作爲輸出。

現在的問題是:我怎樣才能將這兩個矩陣的元素智能和列智能乘以另一個矩陣或「列表」對象或數組?

回答

7

您可以嘗試類似如下:

> 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 
+0

這正是我需要的。謝謝。現在有任何機會讓我打擾你,讓R中的命令分別添加列表(?)中的所有列或您在答案中顯示的對象? – Toni

+0

@AntoniParellada,你是什麼意思的「分別添加」?你最終的結果是什麼? – A5C1D2H2I1M1N2O1R2T1

+0

'6 6 6 // 4 2 2 // 2 4 0 // 0 0 -4' – Toni

4

不知道你是否想要一個數組或列表的最後。如果一個數組,你可以使用apply一些重塑

array(apply(A, 2, function(x) x*B), c(3,3,4)) 
# OR array(apply(A, 2, `*`, B), c(3,3,4)) 
1
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]