【问题标题】:How to add vectors with different length?如何添加不同长度的向量?
【发布时间】:2010-12-28 17:22:14
【问题描述】:

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

非常感谢大家=)

【问题讨论】:

    标签: matlab vector octave


    【解决方案1】:

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

    首先,我将加载一些内置的 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 类型以执行操作,然后在重新保存图像之前对其进行缩放。

    【讨论】:

    • 哇!非常感谢您提供非常详细的解决方案!这正是我想做的。 =)
    【解决方案2】:

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

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

    【讨论】:

    • 酷。这是因为我有 2 个矩阵,实际上是我想添加的灰度图片。所以现在我想将您的解决方案推广到矩阵 =)
    • 是的,例如,当将信号视为向量时(表示 z 变换)
    【解决方案3】:

    我已经十年没有使用 MATLAB,但我认为您必须这样做:

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

    【讨论】:

    • 它给出“错误:不平衡或意外的括号或括号。”但是“cc = aa + [bb zeros(1,length(bb))];”正在工作 =)
    • @Louise,我的错,应该是 length 而不是 sizezeros(1,length(bb)) 工作只是一个巧合,因为 length(bb) = length(aa) - length(bb)
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多