2009-12-21 39 views
6

Vorrei aggiungere due vettori con lunghezze diverse in Matlab o Octave. Per esempio.Come aggiungere vettori con lunghezza diversa?

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

che dovrebbe sfociare in un vettore contenente cc

cc = [101 102 3 4] 

nessuno riesce a capire come fare questo?

Aggiornamento: questo è il codice che ho terminato con i segnali che poi convertirò in immagini in scala di grigi.

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

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

plot(1:length(tc),tc) 

La ringrazio molto per tutti voi =)

risposta

6

Questo non ha alcun senso matematicamente, ma se insistete, si può fare questo:

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

Cool. È perché ho 2 matrici, che in realtà sono immagini in scala di grigi che vorrei aggiungere. Quindi ora mi piacerebbe generalizzare la soluzione alle matrici =) – Louise

+2

-1: in alcuni casi ha senso matematico. –

+0

sì, ad esempio, quando si trattano segnali come vettori (indica la z-transform) –

4

non ho utilizzato MATLAB in dieci anni, ma penso che si dovrà fare qualcosa di simile:

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

Fornisce "Errore: parentesi o parentesi squilibrata o inattesa". Ma "cc = aa + [bb zeros (1, length (bb))];" sta funzionando =) – Louise

+1

@Louise, My bad, avrebbe dovuto essere 'length' e non' size'. Quel 'zeros (1, lunghezza (bb))' funziona è solo una coincidenza poiché 'length (bb) = length (aa) - length (bb)'. –

+0

Fresco. Grazie per averlo chiarito. – Louise

9

per il caso 1-D che fare con un insieme di vettori, i altre risposte indicano le soluzioni corrette (che includono il riempimento del vettore più breve con gli zeri o l'esecuzione dell'aggiunta utilizzando un sottoindice nel vettore più lungo). Tuttavia, dal momento che hai menzionato in un commento che in definitiva desideri aggiungere due immagini in scala di grigi, ho pensato di mostrarti una soluzione 2D più generale per le matrici.

In primo luogo, io caricare alcuni built-in immagini di esempio MATLAB e ottenere le loro dimensioni:

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

Si noti che ho convertito l'immagine RGB in scala di grigio primo utilizzo rgb2gray. Poi, farò una nuova matrice di zeri cui dimensione è la massima delle dimensioni delle due immagini:

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

Si noti che ho incluso 'uint8' nella chiamata a zeros, dal momento che si desidera che la matrice di zeri a essere dello stesso tipo delle immagini in modo che le operazioni successive su di esse funzionino correttamente. La matrice newImage ora è abbastanza grande da contenere una delle due immagini. Infine, le immagini possono essere aggiunte alla nuova immagine in questo modo:

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

e si possono visualizzare con il seguente:

imagesc(newImage); 
colormap(gray); 

enter image description here

NOTA: Una cosa importante da considerare è il tipo che usi per le immagini. Normalmente, i dati di immagine caricati in MATLAB sono di tipo uint8. Tuttavia, si può notare che l'aggiunta di due immagini intero senza segno a 8 bit come ho fatto sopra può portare a saturazione in cui i pixel superano il valore di 255 (il valore massimo per un intero senza segno a 8 bit). Il risultato è che le parti dell'immagine appaiono di un bianco brillante e perdono i dettagli (notare alcuni dei peperoni che si sovrappongono all'immagine più piccola sopra). Si consiglia di evitare ciò ridimensionando i valori nelle immagini prima di aggiungerli o convertendo le immagini in digitare double per eseguire le operazioni e ridimensionarle prima di salvare nuovamente l'immagine.

+0

WOW! Grazie mille per questa soluzione molto dettagliata! Era esattamente quello che volevo fare. =) – Louise

1

Se è un dato di fatto che è più grande di aa bb, quindi vorrei fare questo:

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