讓我們從一些示例數據開始。請包括你的問題這樣的事情的習慣得到:
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
請使用有效的R語法分享您的數據。 – Gregor
這些數據是前面的函數和循環的結果,但我認爲如果我複製整個代碼太混亂了,因爲它是一個我正在處理的統計項目,並且實際上並沒有與該代碼有關的內容問題,所以我只是給你留下了我的數據輸出,來自R中的環境,說明我的數據看起來像 – Varren
我編輯了我的問題,因爲我認爲前面的內容並不清楚。我想將mm矩陣(4x1向量)中的第1列與其轉置mm_t(1x4向量)中的第1行相乘,這將使我留下100個4x4矩陣 – Varren