2016-11-16 211 views
0

我有一個4x100的矩陣,我想在其轉置等中將第1列與第1行相乘,並將這些矩陣存儲在某處以便能夠在稍後取得這些新矩陣的總和。將矩陣的列乘以它的列

我真的不知道從哪裏開始,因爲我在列 - 行乘法後得到了4x4矩陣。由於這一事實,我不能將它們存儲在一個矩陣

數據:

mm num[1:4,1:100] 

mm_t num[1:100,1:4] 

我想以某種方式

list1=list() 
for(i in 1:100){ 
    list1[i] <- mm[,i]%*%mm_t[i,] 
} 

創建列表,但我需要一些更多的指標,我認爲因爲這只是在每個參數中留下一個數字。

+0

請使用有效的R語法分享您的數據。 – Gregor

+0

這些數據是前面的函數和循環的結果,但我認爲如果我複製整個代碼太混亂了,因爲它是一個我正在處理的統計項目,並且實際上並沒有與該代碼有關的內容問題,所以我只是給你留下了我的數據輸出,來自R中的環境,說明我的數據看起來像 – Varren

+0

我編輯了我的問題,因爲我認爲前面的內容並不清楚。我想將mm矩陣(4x1向量)中的第1列與其轉置mm_t(1x4向量)中的第1行相乘,這將使我留下100個4x4矩陣 – Varren

回答

0

讓我們從一些示例數據開始。請包括你的問題這樣的事情的習慣得到:

nr = 4 
nc = 100 
set.seed(47) 
mm = matrix(runif(nr * nc), nrow = nr) 

這裏有一個工作的答案,非常相似,你的嘗試:

result = list() 
for (i in 1:ncol(mm)) result[[i]] = mm[, i] %*% t(mm[, i]) 
result[1:2] 
# [[1]] 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 0.9544547 0.3653018 0.7439585 0.8035430 
# [2,] 0.3653018 0.1398132 0.2847378 0.3075428 
# [3,] 0.7439585 0.2847378 0.5798853 0.6263290 
# [4,] 0.8035430 0.3075428 0.6263290 0.6764924 
# 
# [[2]] 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 0.3289532 0.3965557 0.2231443 0.2689613 
# [2,] 0.3965557 0.4780511 0.2690022 0.3242351 
# [3,] 0.2231443 0.2690022 0.1513691 0.1824490 
# [4,] 0.2689613 0.3242351 0.1824490 0.2199103 

至於爲什麼你沒有工作,我們可以試驗並看到確實我們得到了一個數字而不是矩陣。原因在於,當您對矩陣的單個行或列進行子集化時,這些維度將被「刪除」並被強制爲一個普通向量。當你矩陣乘以兩個向量時,你會得到他們的點積。

mmt = t(mm) 
mm[, 1] %*% mmt[1, ] 
#   [,1] 
# [1,] 2.350646 
dim(mm[, 1]) 
# NULL 
dim(mmt[1, ]) 
# NULL 

我們可以通過在子集的代碼

dim(mmt[1, , drop = FALSE]) 
# [1] 1 4 

指定drop = FALSE避免這一點,因此稍微修改你的企圖,只是增加drop = FALSE將使它發揮作用。

res2 = list() 
for (i in 1:ncol(mm)) res2[[i]] = mm[, i] %*% mmt[i, , drop = FALSE] 
identical(result, res2) 
# [1] TRUE 
+0

這很完美,謝謝!我不知道在矩陣的行/列子集中這些維度會下降,但這些信息在將來會派上用場 – Varren

0

首先,您的數據調用不明確。其次,你tryign本身乘以每個值,還是矩陣乘法

我們創建了一個4×100矩陣及其轉置:

mm <- matrix(1:400, nrow = 4, ncol = 100) 
mm.t <- t(mm) 

然後我們可以做矩陣乘法(這是你做了什麼,和你從矩陣乘法定義一個4×4矩陣https://www.wikiwand.com/en/Matrix_multiplication

如果我們想通過自己乘以每個指數(所以毫米[1,1]由毫米[1,1]),則:

mm * mm 

這將產生4x100矩陣,其中每個值都是原始值的平方。

如果我們希望用本身每一列的矩陣乘法,則:

sapply(1:100, function(x) { 
    mm[, x] %*% mm[, x] 
}) 

這導致100個值:每一個是與其本身4X1向量的矩陣乘積。

+0

我對數據的要求是在另一個塊中,所以mm和mm_t從R中的環境中獲取,只是爲了讓您知道我正在處理的內容。 恐怕你的sapply功能不會讓我滿意。 sapply只給了我100個值,而不是100個4x4矩陣,如果我想從mm轉換一個4x1向量並從它的轉置中乘1x4向量,應該是輸出結果mm_t – Varren

+0

我編輯了我的問題,因爲我認爲以前不是明確。我想在mm矩陣(4x1向量)中將第1列與第1行的轉置mm_t(1x4向量)相乘,這將使我有100個4x4矩陣 – Varren