Beginnen wir mit einigen Beispieldaten. Bitte setzen Sie sich in die Gewohnheit, Dinge wie diese in Ihrer Frage wie:
nr = 4
nc = 100
set.seed(47)
mm = matrix(runif(nr * nc), nrow = nr)
Hier ist eine Arbeits Antwort, sehr ähnlich zu Ihrem Versuch:
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
Wie, warum dein, funktionierte nicht wir können Experimentieren Sie und sehen Sie, dass wir tatsächlich eine Zahl und nicht eine Matrix erhalten. Der Grund dafür ist, dass wenn Sie eine einzelne Zeile oder Spalte einer Matrix unterteilen, die Dimensionen "fallengelassen" und zu einem einfachen Vektor gezwungen werden. Und wenn Sie Matrix zwei Vektoren multiplizieren, erhalten Sie ihr Punktprodukt.
mmt = t(mm)
mm[, 1] %*% mmt[1, ]
# [,1]
# [1,] 2.350646
dim(mm[, 1])
# NULL
dim(mmt[1, ])
# NULL
Wir können dies vermeiden, indem drop = FALSE
im Subset Code
dim(mmt[1, , drop = FALSE])
# [1] 1 4
Angabe Und so leicht Ihr Versuch ändern, nur drop = FALSE
Zugabe wird es funktioniert.
res2 = list()
for (i in 1:ncol(mm)) res2[[i]] = mm[, i] %*% mmt[i, , drop = FALSE]
identical(result, res2)
# [1] TRUE
Bitte teilen Sie Ihre Daten mit gültiger R-Syntax. – Gregor
Die Daten sind ein Ergebnis von vorherigen Funktionen und for-Schleifen, aber ich denke, es wäre zu verwirrend, wenn ich den ganzen Code kopieren würde, da es ein Statistikprojekt ist, mit dem ich arbeite und nicht wirklich etwas mit diesem Code zu tun hat Problem, so habe ich Sie nur mit meiner Datenausgabe verlassen, aus der Umgebung in R, wie meine Daten aussehen – Varren
Ich habe meine Frage bearbeitet, weil ich denke, die vorherige war nicht klar. Ich möchte Spalte 1 in der mm-Matrix (4x1-Vektor) mit Zeile 1 in seiner Transponierung mm_t (1x4-Vektor) multiplizieren, was mich mit 100 4x4-Matrizen belassen sollte. – Varren