ein

2016-06-08 10 views
2

zu einem Zeitpunkt zu einem anderen Array-Elemente von einem Array hinzufügen Wenn ichein

A = [2 4 6 8] 

und ein anderes Array

ein Array haben
B = [1 2 3 4 5 6 7] 

dann das erste Element A nehmen ich will, das ist 2, und fügen Sie jedes Element von B hinzu und speichern Sie das resultierende Array in einer Matrix C.
Als nächstes möchte ich 4 nehmen, fügen Sie es zu jedem Element von B hinzu und speichern Sie es erneut unter C.
Ähnlich wird für 6 und 8 Elemente das gleiche Verfahren wiederholt.

Wie kann ich die Matrix C ohne Schleifen verwenden?

C = [(3 4 5 6 7 8 9)' (5 6 7 8 9 10 11)' (7 8 9 10 11 12 13)' (9 10 11 12 13 14 15)'] 
+1

Was ist Ihre erwartete Ausgabe? – Yvon

Antwort

6

Nur bsxfun verwenden:

>> C = bsxfun(@plus, A, B.') 

C = 

    3  5  7  9 
    4  6  8 10 
    5  7  9 11 
    6  8 10 12 
    7  9 11 13 
    8 10 12 14 
    9 11 13 15 
+0

danke. Was, wenn ich die Elemente von "A" in beliebiger Reihenfolge und nicht in der gezeigten Reihenfolge auswählen möchte, kann 'bxsfun' das zulassen? Oder sollte ich sie zuerst in der gewünschten Reihenfolge bestellen? Beispiel, anstelle von 2,4,6,8 ... kann 'bxsfun' verwendet werden, um 4,2,8,6-> in dieser Reihenfolge zu wählen? – nashynash

+1

@nashynash reorder 'A' natürlich selbst. Warum sollte 'bsxfun' das können? Aber in MATLAB ist es eine triviale Sache: 'bsxfun (@plus, A ([2,1,4,3]), B)' – Dan

+0

Sie brauchen nicht wirklich '.'' für reelle Zahlen,' ' 'ist genug :) – Bernhard

0

Eine weitere Möglichkeit zur Fliese ist und auf einmal tun es. Dazu haben Sie viele Möglichkeiten, je nach Argument Größe oder Speicherbeschränkungen oder anstelle Überschreiben Freiheit usw.

Eine Möglichkeit, ein Array bietet eine äußere nachzubilden Produkt

(auch dyadische oder 1-Rang so weiter genannt)

Also, wenn Sie führen Sie die folgende Multiplikation:

[1] 
[1]  
[1] * [a b c ... ] 
[1] 
[1] 

das Ergebnis ist ein Rang 1-Matrix mit gleichen Zeilen

[a b c ... ] 
[a b c ... ] 
[a b c ... ] 
[a b c ... ] 
[a b c ... ] 

der gleichen etwas, was Sie mit der Matlab-Funktion repmat tun können, die ein Array in einer viel allgemeineren Weise wiederholt und intern auf bsxfun beruht. Hier genügt eine einfache Version.

# repmat(A,number of repetitions vertically,number of repetitions horizontally) 
repmat([a b c ...]',1,n) 

gibt wieder das gleiche für sagen n=4

[a a a a] 
[b b b b] 
[c c c c] 
    . 
    . 
    . 

auch können Sie kron verwenden, die die Kronecker-Produkt über meshgrid und damit im Wesentlichen 2D (in aller Kürze Fliese das zweite Argument mit jeder Platte durchgeführt wird multipliziert mit dem Element des ersten Arguments)

kron([1;1;1;1;1],[a b c d e]) 

was das gleiche Ergebnis mit der Tanne ergibt st Argument. Jetzt können Sie sehen, dass abhängig von der Größe des Arguments oder der Menge der temporären Arrays, die erstellt werden, Sie einen Cocktail dieser Methoden haben können, obwohl sie die gleichen Operationen ausführen.Beispielsweise; zwei gleichwertige Befehle, die intern unterscheiden sind

C = ones(length(B),1)*A + repmat(B',1,length(A)); 

und

C = kron(ones(length(B),1),A) + kron(ones(1,length(A)),B') 

daher abhängig von der Größe von A und B Sie von diesen Alternativen profitieren könnten, sollten Sie verlangen, dass viel von hohen Leistung. So kann die Hälfte der Operation in einer Richtung und die andere in einer anderen durchgeführt werden. Es ist eher eine Kunst als die Wissenschaft. Bei diesen Größen sind sie jedoch eher kleine Unterschiede.

+1

warum mischen Sie die Methoden? Du hättest einfach "C = Einsen (Länge (B), 1) * A + B" gehen können. * Einsen (1, Länge (A)) "Ich bezweifle, dass" Repmat "die Matrix-Multiplikation übertrifft. – Dan

+0

@Dan Nur um Möglichkeiten zu zeigen. Sie unterscheiden sich bei diesen Größen nicht zu sehr in der Geschwindigkeit. – percusse

+1

Ich denke, das ist verwirrend. Wenn Sie Möglichkeiten zeigen wollen, dann schreiben Sie lieber die beiden Methoden separat aus. Aber das Mischen bedeutet, dass jeder, der den Code liest, herausfinden muss, was jeder einzelne Begriff macht, und dann möglicherweise auf eine wilde Jagd gehen, um herauszufinden, warum '*' gut für den ersten Ausdruck ist, aber 'repmat' ist besser für den zweite ... – Dan