我想在Matlab或Octave中添加两个不同长度的向量。 E.g。
aa = [1 2 3 4];
bb = [100 100];
哪个应该导致包含
的矢量cccc = [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)
非常感谢你们所有人=)
答案 0 :(得分:10)
对于处理一组向量的1-D情况,其他答案指出正确的解决方案(包括用零填充较短的向量或使用子索引对较长向量执行加法)。但是,由于您在评论中提到您最终想要将两个灰度图像一起添加,我想我会向您展示一个更为通用的二维矩阵解决方案。
首先,我将加载一些内置的MATLAB样本图像并获得它们的大小:
image1 = rgb2gray(imread('peppers.png'));
image2 = imread('cameraman.tif');
[r1, c1] = size(image1);
[r2, c2] = size(image2);
请注意,我首先使用rgb2gray
将RGB图像转换为灰度。接下来,我将制作一个新的零矩阵,其大小是两个图像大小的最大值:
newImage = zeros(max(r1, r2), max(c1, c2), 'uint8');
请注意,我在zeros
的调用中包含了'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位无符号整数的最大值)的饱和度。结果是图像的某些部分看起来是亮白色并且丢失细节(注意一些与上面较小图像重叠的辣椒)。您可能希望通过在添加图像之前缩放图像中的值,或者将图像转换为键入double
以执行操作,然后在重新保存图像之前缩放图像来避免这种情况。
答案 1 :(得分:6)
这在数学上没有任何意义,但如果你坚持,你可以这样做:
cc = aa + [bb zeros(1,2)];
答案 2 :(得分:4)
我十年没有使用MATLAB了,但我认为你必须做一些像:
cc = aa + [bb zeros(1, length(aa) - length(bb))]
答案 3 :(得分:1)
如果给定的aa大于bb,那么我会这样做:
cc = aa;
cc(1:length(bb)) = cc(1:length(bb)) + bb;