2016-11-16 8 views
0

Ich habe eine 4x100 Matrix, wo ich Spalte 1 mit der Reihe 1 in seiner Transponierung usw. multiplizieren und diese Matrizen irgendwo speichern möchte, um die Summe dieser neuen Matrizen später nehmen zu können.Multiplizieren Sie eine Matrix 'Spalten mit ihren Spalten

Ich weiß wirklich nicht wo ich anfangen soll aufgrund der Tatsache, dass ich 4x4 Matrizen nach der Spalten-Zeilen-Multiplikation bekomme. Aufgrund dieser Tatsache kann ich speichern sie nicht in einer Matrix

Daten:

mm num[1:4,1:100] 

mm_t num[1:100,1:4] 

Ich denke an eine Liste in irgendeiner Art und Weise zu schaffen

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

aber ich brauche noch einige Indizes i denken weil das mich nur mit einer Zahl in jedem Argument verlässt.

+0

Bitte teilen Sie Ihre Daten mit gültiger R-Syntax. – Gregor

+0

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

+0

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

Antwort

0

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

Das ist perfekt, danke! Ich hatte keine Ahnung, dass die Dimensionen fallen gelassen werden, wenn Sie eine Zeile/Spalte einer Matrix unterteilen, aber diese Information wird in Zukunft nützlich sein – Varren

0

Zuerst ist Ihr Aufruf für Daten nicht klar. Zweitens sind Sie selbst jeden Wert multiplizieren tryign, oder sie Matrixmultiplikation

Wir schaffen eine 4x100-Matrix und ihre Transponierte:

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

Dann können wir die Matrixmultiplikation tun (das ist, was Sie getan haben, und Sie erhalten eine 4 x 4-Matrix aus der Definition der Matrixmultiplikation https://www.wikiwand.com/en/Matrix_multiplication)

Wenn wir jeden Index von selbst vermehren wollen (so mm [1,1] durch mm [1,1]), dann:

mm * mm 

Dies ergibt eine 4x100-Matrix, wobei jeder Wert das Quadrat des ursprünglichen Wertes ist.

Wenn wir die Matrixmultiplikation jeder Spalte mit sich selbst wollen, dann:

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

Dies führt zu 100 Werte: jeder das Matrixprodukt eines 4x1-Vektor mit sich selbst ist.

+0

Mein Aufruf für Daten ist in einem anderen Chunk, also mm und mm_t wird aus der Umgebung in R genommen, nur um Ihnen eine Idee zu geben, woran ich arbeite. Ich habe Angst, dass Ihre Sapply-Funktion mich nicht mit dem lässt, was ich will. Das Sapply gibt mir nur 100 Werte, nicht 100 4x4 Matrizen, die die Ausgabe sein sollten, wenn ich einen 4x1 Vektor von mm und einen 1x4 Vektor von seiner Transponierten multiplizieren möchte. Mm_t – Varren

+0

Ich habe meine Frage bearbeitet, weil ich denke, dass die vorherige nicht war 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 verlassen sollte – Varren

Verwandte Themen