2009-12-21 14 views
6

Chciałbym dodać dwa wektory o różnych długościach w Matlab lub Octave. Na przykład.Jak dodać wektory o różnej długości?

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

co powinno skutkować w cc wektor zawierający

cc = [101 102 3 4] 

ktoś może dowiedzieć się, jak to zrobić?

Aktualizacja: To kod, który otrzymałem dla sygnałów, które później przekształcono w obrazy w skali szarości.

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

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

plot(1:length(tc),tc) 

Dziękuję bardzo wam wszystkim =)

Odpowiedz

6

To nie ma żadnego sensu matematycznie, ale jeśli nalegać, można to zrobić:

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

cool. To dlatego, że mam 2 matryce, które w rzeczywistości są obrazami w skali szarości, które chciałbym dodać. Więc teraz chciałbym uogólnić twoje rozwiązanie na macierze =) – Louise

+2

-1: w niektórych przypadkach ma to sens matematyczny. –

+0

tak, na przykład, traktuje sygnały jako wektory (czyli z-transform) –

4

nie mam stosowane MATLAB w ciągu dziesięciu lat, ale myślę, że trzeba zrobić coś takiego:

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

Daje "Błąd: niesymetryczny lub nieoczekiwany nawias lub nawias". Ale "cc = aa + [bb zeros (1, długość (bb))];" działa =) – Louise

+1

@Louise, Moja zła, powinna być "długość", a nie "rozmiar". To, że 'Zera (1, długość (bb)) działa, to tylko zbieg okoliczności, ponieważ' length (bb) = length (aa) - length (bb) '. –

+0

Cool. Dziękuję za wyjaśnienie. – Louise

9

dla przypadku 1-D do czynienia ze zbiorem wektorów, z inne odpowiedzi wskazują poprawne rozwiązania (polegające na wypełnianiu krótszego wektora zerami lub dodawaniu za pomocą subindeksu do dłuższego wektora). Ponieważ jednak wspomniałeś w komentarzu, że ostatecznie chcesz dodać dwa obrazy w skali szarości, pomyślałem, że pokażę ci bardziej ogólne rozwiązanie 2D dla macierzy.

Najpierw załadować kilka wbudowanych w obrazach przykładowych MATLAB i uzyskać ich rozmiary:

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

Zauważ, że przekształcony obraz RGB na skalę szarości pierwszym użyciem rgb2gray. Następnie zrobię nową macierz zer, których rozmiar jest maksymalna od wielkości dwóch obrazów:

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

Zauważ, że zawarte 'uint8' w wywołaniu zeros, ponieważ chcesz macierz zer do być tego samego typu co obrazy, aby kolejne operacje na nich działały poprawnie. Macierz jest teraz wystarczająco duża, aby pomieścić jedno z dwóch obrazów. Wreszcie, obrazy mogą być dodawane do nowego obrazu tak:

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

I można zobaczyć je z następujących czynności:

imagesc(newImage); 
colormap(gray); 

enter image description here

UWAGA: Jedna ważna rzecz rozważ to typ, jakiego używasz do obrazów. Zwykle dane obrazu ładowane do MATLAB mają typ uint8. Jednak możesz zauważyć, że dodanie dwóch 8-bitowych bez znaku liczby całkowitej, tak jak to zrobiłem powyżej, może spowodować nasycenie, w którym piksele przekraczają wartość 255 (maksymalna wartość dla 8-bitowej liczby całkowitej bez znaku). Powoduje to, że części obrazu wyglądają na jaskrawe białe i tracą szczegóły (zauważ, że niektóre z papryczek pokrywają mniejszy obrazek powyżej). Można tego uniknąć, skalując wartości na obrazach przed ich dodaniem lub konwertując obrazy na typ double, aby wykonać operacje, a następnie skalując je przed ponownym zapisaniem obrazu.

+0

WOW! Dziękuję bardzo za to bardzo szczegółowe rozwiązanie! Dokładnie to chciałem zrobić. =) – Louise

1

Jeśli jest to zważywszy, że jest większy niż aa bb, to bym to zrobić:

cc = aa; 
cc(1:length(bb)) = cc(1:length(bb)) + bb; 
Powiązane problemy