2009-12-21 7 views
6

Ich möchte zwei Vektoren mit verschiedenen Längen in Matlab oder Octave hinzufügen. Z.B.Wie Vektoren mit unterschiedlicher Länge hinzugefügt werden?

aa = [1 2 3 4]; 
bb = [100 100]; 

, die in einem Vektor cc enthält

cc = [101 102 3 4] 

Kann jemand herausfinden, führen sollte, wie dies zu tun?

Update: Dies ist der Code, mit dem ich für die Signale endete, die ich später später in Graustufenbilder umwandelte.

load train; 
t = y; 
load chirp; 
c = y; 

tc = c + [t; zeros(length(c) - length(t),1)]; 

plot(1:length(tc),tc) 

Vielen Dank an euch alle =)

Antwort

6

Dieser keinen Sinn mathematisch nicht machen, aber wenn Sie darauf bestehen, können Sie dies tun:

cc = aa + [bb zeros(1,2)]; 
+0

kühlen. Es ist, weil ich 2 Matrixen habe, die tatsächlich Graustufenbilder sind, die ich hinzufügen möchte. So, jetzt möchte ich Ihre Lösung auf Matrixen verallgemeinern =) – Louise

+2

-1: es macht in einigen Fällen mathematisch Sinn. –

+0

Ja, zum Beispiel, wenn Signale als Vektoren behandelt werden (bedeutet die Z-Transformation) –

4

Ich habe nicht MATLAB in zehn Jahren verwendet, aber ich denke, Sie werden wie etwas zu tun haben:

cc = aa + [bb zeros(1, length(aa) - length(bb))] 
+0

Es gibt "Fehler: Unsymmetrische oder unerwartete Klammer oder Klammer." Aber "cc = aa + [bb Nullen (1, Länge (bb))];" funktioniert =) – Louise

+1

@Louise, Mein Schlechter, es hätte "Länge" und nicht "Größe" sein sollen. Das 'Nullen (1, Länge (bb))' funktioniert nur zufällig, da 'Länge (bb) = Länge (aa) - Länge (bb) 'ist. –

+0

Kühl. Danke, dass du das geklärt hast. – Louise

9

Für den 1-D Fall mit einem Satz von Vektoren zu tun, die andere Antworten weisen auf die richtigen Lösungen hin (wobei der kürzere Vektor mit Nullen aufgefüllt wird oder die Addition unter Verwendung eines Subindex in den längeren Vektor durchgeführt wird). Da Sie jedoch in einem Kommentar erwähnt haben, dass Sie letztendlich zwei Graustufenbilder zusammenfügen möchten, dachte ich, ich würde Ihnen eine allgemeinere 2-D-Lösung für Matrizen zeigen.

Zuerst werde ich einige eingebaute in MATLAB Beispielbilder laden und ihre Größe bekommen:

image1 = rgb2gray(imread('peppers.png')); 
image2 = imread('cameraman.tif'); 
[r1, c1] = size(image1); 
[r2, c2] = size(image2); 

Beachten Sie, dass ich das RGB-Bild umgewandelt erste rgb2gray mit Graustufen. Als nächstes werde ich eine neue Matrix von Nullen, deren Größe das Maximum der Größen der beiden Bilder machen:

newImage = zeros(max(r1, r2), max(c1, c2), 'uint8'); 

Beachten Sie, dass ich 'uint8' zu zeros im Aufruf enthalten, da Sie die Matrix von Nullen wollen Sie müssen denselben Typ wie Ihre Bilder haben, damit nachfolgende Operationen an ihnen ordnungsgemäß funktionieren. Die Matrix newImage ist jetzt groß genug, um eines der beiden Bilder zu enthalten.

newImage(1:r1, 1:c1) = image1;      % Insert image 1 
newImage(1:r2, 1:c2) = newImage(1:r2, 1:c2)+image2; % Add image 2 

Und Sie können sie mit dem folgenden Modus: Schließlich können die Bilder, die auf das neue Bild wie so hinzugefügt werden

imagesc(newImage); 
colormap(gray); 

enter image description here

HINWEIS: Eine wichtige Sache zu Betrachten Sie den Typ, den Sie für die Bilder verwenden. Normalerweise sind Bilddaten, die in MATLAB geladen werden, vom Typ uint8. Möglicherweise stellen Sie jedoch fest, dass das Hinzufügen von zwei vorzeichenlosen 8-Bit-Ganzzahlbildern wie oben zu einer Sättigung führen kann, wenn Pixel den Wert 255 überschreiten (der Maximalwert für eine 8-Bit-Ganzzahl ohne Vorzeichen). Das Ergebnis ist, dass Teile des Bildes hellweiß aussehen und Details verlieren (beachten Sie einige der Paprikaschoten, die das kleinere Bild oben überlappen). Sie können dies vermeiden, indem Sie die Werte in Ihren Bildern skalieren, bevor Sie sie hinzufügen, oder indem Sie Ihre Bilder in den Typ double konvertieren, um die Operationen auszuführen und sie dann zu skalieren, bevor Sie das Bild erneut speichern.

+0

WOW! Vielen Dank für diese sehr detaillierte Lösung! Das war genau das, was ich machen wollte. =) – Louise

1

Wenn es eine gegeben ist, dass aa größer als bb ist, dann würde ich dies tun:

cc = aa; 
cc(1:length(bb)) = cc(1:length(bb)) + bb;