2009-12-21 3 views
6

Я хотел бы добавить два вектора разной длины в Matlab или Octave. Например.Как добавить векторы различной длины?

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

Что должно привести к вектору куб.см, содержащего

cc = [101 102 3 4] 

Может кто-нибудь выяснить, как это сделать?

Обновление: Это код, который я получил для сигналов, которые затем преобразуются затем в изображения с серой шкалой.

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

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

plot(1:length(tc),tc) 

Большое спасибо вам всем =)

ответ

6

Это не имеет никакого смысла математически, но если вы настаиваете, то вы можете сделать это:

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

Круто. Это потому, что у меня есть 2 матрицы, которые на самом деле представляют собой изображения в масштабе серого, которые я хотел бы добавить. Итак, теперь я хотел бы обобщить ваше решение на матрицы =) – Louise

+2

-1: в некоторых случаях это имеет смысл математически. –

+0

Да, например, при обработке сигналов в виде векторов (означает z-преобразование) –

4

Я не используется MATLAB в десять лет, но я думаю, что вы должны сделать что-то вроде:

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

Он дает «Ошибка: несбалансированные или неожиданные скобки или скобки». Но «cc = aa + [bb нули (1, длина (bb))]; работает =) – Louise

+1

@Louise, мой плохой, он должен был быть 'length', а не' size'. То, что 'zeros (1, length (bb))' работает, просто совпадение, поскольку 'length (bb) = length (aa) - length (bb)'. –

+0

Прохладный. Спасибо, что освободили. – Louise

9

для 1-D случае имеем дело с множеством векторов, в другие ответы указывают на правильные решения (включая заполнение более короткого вектора нулями или выполнение добавления с использованием субиндекса в длинный вектор). Однако, поскольку вы упомянули в комментарии, что в конечном итоге вы хотите добавить два изображения в оттенках серого, я подумал, что покажу вам более общее 2-D решение для матриц.

Во-первых, я буду загружать несколько встроенных образцов изображений MATLAB и получить их размеры:

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

Обратите внимание, что я преобразовал изображение RGB в оттенки серого с помощью первого rgb2gray. Далее, я сделаю новую матрицу нулей, размер которых максимум размеров двух изображений:

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

Обратите внимание, что я включил 'uint8' в вызове zeros, так как вы хотите матрицу нулей в быть тем же самым типом, что и ваши изображения, чтобы последующие операции над ними работали правильно. Матрица newImage теперь достаточно велика, чтобы содержать одно из двух изображений. Наконец, изображения могут быть добавлены к новому образу, как так:

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

И вы можете просмотреть их следующим образом:

imagesc(newImage); 
colormap(gray); 

enter image description here

Примечание: Одна важная вещь рассмотрим тип, который вы используете для изображений. Обычно данные изображения, загружаемые в MATLAB, имеют тип uint8. Однако вы можете заметить, что добавление двух 8-разрядных целочисленных изображений без знака, как я сделал выше, может привести к насыщению, когда пиксели превышают значение 255 (максимальное значение для 8-разрядного целого числа без знака). В результате части изображения выглядят ярко-белыми и теряют детали (обратите внимание на некоторые из перцев, которые перекрывают меньшее изображение выше). Вы можете избежать этого, масштабируя значения в своих изображениях перед их добавлением или путем преобразования изображений для ввода double для выполнения операций, а затем для их масштабирования перед сохранением изображения.

+0

WOW! Большое вам спасибо за очень подробное решение! Это было именно то, что я хотел сделать. знак равно – Louise

1

Если учитывая, что аа больше, чем бб, то я хотел бы сделать это:

cc = aa; 
cc(1:length(bb)) = cc(1:length(bb)) + bb; 
Смежные вопросы