Как добавить векторы с другой длиной?

Я хотел бы добавить два вектора с различными длинами в 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)

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

7
задан gnovice 7 May 2017 в 05:11
поделиться

4 ответа

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

cc = aa + [bb zeros(1,2)];
6
ответ дан 6 December 2019 в 08:43
поделиться

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

Во-первых, я загружу несколько встроенных Образцы изображений 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' в вызов нулей ], поскольку вы хотите, чтобы матрица нулей была того же типа, что и ваши изображения, чтобы последующие операции с ними работали правильно. Матрица 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-битного целого числа без знака). В результате части изображения выглядят ярко-белыми и теряют детали (обратите внимание на некоторые перцы, которые перекрывают меньшее изображение выше).

10
ответ дан 6 December 2019 в 08:43
поделиться

Я думаю, что решение этой проблемы заключается не в каком-либо синтаксисе PHP, а в дизайне вашего кода.

Вы можете либо сделать массив численно проиндексированным (это может быть маловероятным для ваше приложение), отслеживать каждый 205-й элемент или выполнять поиск в массиве только один раз (кешировать список каждого 205-го элемента).

На мой взгляд, было бы проще реализовать отслеживание каждого 205-го элемента. Вы бы просто подсчитали все элементы в базе данных или что-то в этом роде, и каждый раз, когда элемент добавляется, проверяйте модуль счета. Если у вас есть еще 205-й элемент, добавьте его в массив. Однако, когда элементы удаляются, это будет сложнее. Возможно, вам придется перепроверить весь массив, чтобы выровнять все свои 205-е элементы.

Сделать это было бы проще, если бы вы могли начать с удаленного элемента и двигаться вперед,

cc = aa + [bb  zeros(1, length(aa) - length(bb))]
4
ответ дан 6 December 2019 в 08:43
поделиться

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

cc = aa;
cc(1:length(bb)) = cc(1:length(bb)) + bb;
1
ответ дан 6 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: