Как добавить векторы разной длины? - PullRequest
7 голосов
/ 21 декабря 2009

Я хотел бы добавить два вектора разной длины в Matlab или Octave. Э.Г.

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

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

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)

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

Ответы [ 4 ]

10 голосов
/ 21 декабря 2009

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

Сначала я загружу несколько встроенных примеров изображений 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 для выполнения операций, а затем масштабируя их перед сохранением изображения.

6 голосов
/ 21 декабря 2009

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

cc = aa + [bb zeros(1,2)];
4 голосов
/ 21 декабря 2009

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

cc = aa + [bb  zeros(1, length(aa) - length(bb))]
1 голос
/ 22 декабря 2009

Если дано, что aa больше, чем bb, то я бы сделал это:

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