7

我想在 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

4 回答 4

10

对于处理一组向量的一维情况,其他答案指出了正确的解决方案(包括用零填充较短的向量或使用子索引执行加法到较长的向量)。但是,由于您在评论中提到您最终希望将两个灰度图像添加在一起,我想我会向您展示一个更通用的矩阵二维解决方案。

首先,我将加载一些内置的 MATLAB 示例图像并获取它们的大小:

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

请注意,我首先使用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);

在此处输入图像描述

注意:要考虑的一件重要事情是您用于图像的类型。通常,加载到 MATLAB 中的图像数据是uint8. 但是,您可能会注意到,像我上面所做的那样添加两个 8 位无符号整数图像会导致像素超过 255 值(8 位无符号整数的最大值)的饱和度。结果是图像的某些部分看起来是明亮的白色并丢失了细节(请注意一些与上面较小图像重叠的辣椒)。您可能希望通过在添加图像之前缩放图像中的值来避免这种情况,或者通过将图像转换为类型double以执行操作,然后在重新保存图像之前对其进行缩放。

于 2009-12-21T16:05:05.513 回答
6

这在数学上没有任何意义,但如果你坚持,你可以这样做:

cc = aa + [bb zeros(1,2)];
于 2009-12-21T12:06:04.543 回答
4

我已经十年没有使用 MATLAB,但我认为您必须执行以下操作:

cc = aa + [bb  zeros(1, length(aa) - length(bb))]
于 2009-12-21T12:07:08.963 回答
1

如果给定 aa 大于 bb,那么我会这样做:

cc = aa;
cc(1:length(bb)) = cc(1:length(bb)) + bb;
于 2009-12-21T23:21:15.090 回答