2009-12-21 74 views
6

我想在Matlab或Octave中添加两个不同长度的向量。例如。如何添加不同长度的向量?

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

应导致含有

cc = [101 102 3 4] 

任何人都可以找出如何做到这一点的矢量CC哪个?

更新:这是我结束的代码,然后我转换为灰度图像的信号。

load train; 
t = y; 
load chirp; 
c = y; 

tc = c + [t; zeros(length(c) - length(t),1)]; 

plot(1:length(tc),tc) 

非常感谢你对你的所有=)

回答

6

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

cc = aa + [bb zeros(1,2)]; 
+0

酷。这是因为我有2个矩阵,其实是我想补充的灰度图。所以现在我想推广你的解决方案矩阵=) – Louise 2009-12-21 12:19:37

+2

-1:它在某些情况下在数学上有意义。 – 2014-06-28 01:46:29

+0

是是的话,例如,治疗信号作为向量时(意味着Z变换) – 2016-12-22 04:18:15

4

我没有使用MATLAB十年,但我认为你将不得不这样做:

cc = aa + [bb zeros(1, length(aa) - length(bb))] 
+0

它给“错误:非平衡的或意外的括号或支架。”但是“cc = aa + [bb zeros(1,length(bb))];”正在工作=) – Louise 2009-12-21 12:20:25

+1

@Louise,我的坏,它应该是'长度',而不是'大小'。从'长度(bb)=长度(aa) - 长度(bb)'开始,'零(1,长度(bb))'起作用只是巧合。 – 2009-12-21 12:27:39

+0

很酷。感谢您的清除。 – Louise 2009-12-21 12:46:48

9

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

首先,我会加载一些内置的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'); 

请注意,我在调用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); 

enter image description here

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

+0

哇!非常感谢您提供非常详细的解决方案!这正是我想要做的。 =) – Louise 2009-12-23 11:25:05

1

如果一个给定的AA比BB大,那么我会做到这一点:

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