Я хотел бы добавить два вектора с различными длинами в 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)
Большое спасибо Вам всем =)
Это не имеет математического смысла, но если вы настаиваете, вы можете сделать это:
cc = aa + [bb zeros(1,2)];
Для одномерного случая, имеющего дело с набором векторов, другие ответы указывают на правильные решения (включая заполнение более короткого вектора нулями или выполнение сложения с использованием субиндекса в более длинный вектор ). Однако, поскольку вы упомянули в комментарии, что в конечном итоге хотите добавить два изображения в градациях серого вместе, я подумал, что покажу вам более общее двухмерное решение для матриц.
Во-первых, я загружу несколько встроенных Образцы изображений 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);
ПРИМЕЧАНИЕ: Одна важная вещь, которую следует учитывать, - это тип, который вы используете для изображений. Обычно данные изображения, которые загружаются в MATLAB, имеют тип uint8
. Однако вы можете заметить, что добавление двух 8-битных целочисленных изображений без знака, как я сделал выше, может привести к насыщению, когда пиксели превышают значение 255 (максимальное значение для 8-битного целого числа без знака). В результате части изображения выглядят ярко-белыми и теряют детали (обратите внимание на некоторые перцы, которые перекрывают меньшее изображение выше).
Я думаю, что решение этой проблемы заключается не в каком-либо синтаксисе PHP, а в дизайне вашего кода.
Вы можете либо сделать массив численно проиндексированным (это может быть маловероятным для ваше приложение), отслеживать каждый 205-й элемент или выполнять поиск в массиве только один раз (кешировать список каждого 205-го элемента).
На мой взгляд, было бы проще реализовать отслеживание каждого 205-го элемента. Вы бы просто подсчитали все элементы в базе данных или что-то в этом роде, и каждый раз, когда элемент добавляется, проверяйте модуль счета. Если у вас есть еще 205-й элемент, добавьте его в массив. Однако, когда элементы удаляются, это будет сложнее. Возможно, вам придется перепроверить весь массив, чтобы выровнять все свои 205-е элементы.
Сделать это было бы проще, если бы вы могли начать с удаленного элемента и двигаться вперед,
cc = aa + [bb zeros(1, length(aa) - length(bb))]
Если задано, что aa больше, чем bb, я бы сделал следующее:
cc = aa;
cc(1:length(bb)) = cc(1:length(bb)) + bb;