【问题标题】:Interweaving vectors交织向量
【发布时间】:2012-05-06 04:12:38
【问题描述】:

我想在 MATLAB 中交织两个向量。事实上,我实际上只是想在每个元素之间添加一个零,但我想我会以学习如何将其应用于其他情况的方式提出问题。

我的具体应用: 我想取一个向量(例如[1 2 3])并输出[0 1 0 2 0 3]

更广泛的问题: 我将如何使用两个不同的向量来做到这一点,例如[1 2 3][9 8 7] 交织产生[9 1 8 2 7 3]

非常感谢您对上述任何一个或两个问题的帮助。

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    我会利用 MATLAB 向量的内部布局:它们以列为主,即列中的值变化最快。要交错两个向量 ab,只需执行以下操作:

    ar = a(:).';    % make sure ar is a row vector
    br = b(:).';    % make sure br is a row vector
    A = [ar;br];   % concatenate them vertically
    c = A(:);      % flatten the result
    

    【讨论】:

    • 微不足道,但要让它返回一个行向量,当然可以像这样更改最后一行:c = A(:)';
    • 使用.'而不是',否则它将无法处理复数。
    【解决方案2】:

    试试

    reshape([[9 8 7];[1 2 3]],1,[])
    

    【讨论】:

    • 我真的很喜欢这个解决方案,但是查看文档,我发现不能保证这个函数对于所有输入或函数的未来实现都会以这种方式运行。特别是,它似乎只保证:“reshape(X,SIZ) 返回一个 N-D 数组,其元素与 X 相同,但重新整形为 SIZ 的大小。”
    • @JacobLee:使用reshape 是安全的。第一个参数是一个矩阵,跟在一个 1 之后,一个花边总是重塑为 1xn。
    • 适用于行和列输入的更通用版本是reshape([A(:).';B(:).'],1,[])
    【解决方案3】:

    这里有一些代码可以完成你想要的:

    nums   = rand(1,3)
    output = zeros(1,2*numel(nums));
    output(2:2:end) = nums
    

    输出如下:

    nums =
    
        0.9134    0.6324    0.0975
    
    
    output =
    
             0    0.9134         0    0.6324         0    0.0975
    

    按照其他两个答案的风格,您可以通过以下方式获得所需的零输出:

    nums = rand(1,3);
    reshape([zeros(size(nums));nums],1,[])
    

    显然,nums 应该替换为您想要使用的向量。如前所述,在调用 reshape 之前,您应该确保它是一个行向量。

    【讨论】:

    • 为了保证是行向量,可以写nums(:)'
    • reshape 解决方案非常优雅!
    【解决方案4】:

    我在 File Exchange 站点 (Interleave Vectors or Matrices) 上编写了一个 MATLAB 函数,它完全可以满足您的需求以及更多功能。只需下载 .m 文件并将该文件放在与其他 .m 文件相同的目录中,或者将函数复制并粘贴到您的程序中。

    此函数按行或列交错任意数量的向量或矩阵。如果输入只是向量,则无需指定方向。额外的元素/行/列附加在输出矩阵的末尾。提供的其他答案对于等长的向量非常具体,或者需要确保向量的方向正确。

    函数使用示例:

    1) 交错矩阵行

    A = [1 2; 3 4] B = [5 6;7 8]
    
    C = interleave2(A, B, 'row') 
    C = [1 2 
         5 6 
         3 4 
         7 8]
    

    2) 矩阵的交错列

    C = interleave2(A, B, 'col') 
    C = [1 5 2 6 
         3 7 4 8]
    

    3) 交织向量(注意:输入向量不必相同方向)

    A = [1 2 3 4] B = [5 6 7 8 9]' 
    C = interleave2(A, B) 
    C = [1 5 2 6 3 7 4 8 9]'
    

    4) 交织 >2 个矩阵

    A = [1 2;3 4] B = [5 6;7 8] 
    C = [9 10;11 12] D = [13 14;15 16]
    
    E = interleave2(A, B, C, D, 'col') 
    E = [1 5 9 13 2 6 10 14 
         3 7 11 15 4 8 12 16]
    

    5) 将 2 个矩阵的列与不相等的列交错

    A = [1 2;3 4] 
    B = [5 6 7 8;9 10 11 12] 
    C = interleave2(A, B, 'col') 
    C = [1 5 2 6 7 8 
         3 9 4 10 11 12] 
    

    6) 交织 >2 个长度不等的向量

    A = [1 2 3 4] B = [5 6 7] 
    C = [8 9 10 11 12 13] 
    D = interleave2(A, B, C) 
    D = [1 5 8 2 6 9 3 7 10 4 11 12 13]
    

    【讨论】:

      【解决方案5】:

      对于最简单的情况,有一个非常“优雅”的解决方案,如this answer 中描述的类似问题。

      a = [9 8 7];
      b = [1 2 3];
      output = kron(a, [1 0]) + kron(b, [0 1]);
      

      如答案中所述,请注意,这效率较低但可能用于更通用的目的而不仅仅是交错,因为它使用Kronecker product 很好- 定义在两个矩阵之间。

      【讨论】:

        【解决方案6】:

        Octave 是一个免费的开源 MatLab 逆向工程,其功能和语言在大多数情况下是相同的。但是,如果您发现自己使用 Octave 进行编码,您可以使用下面的代码来交错两个(实值)行向量 xy

        [x;y](:)'
        

        警告:这是 Octave 代码,在 MatLab 中不起作用。

        【讨论】:

        • 不做复数。如果向量长度不同,则不起作用。不检查输入是行向量。等等。但是,如果您不担心这些情况,并且您需要一些可以高效编写和运行的东西,就是这样。
        • @gnovice 是的,我正在使用 Octave 进行编码。我不知道语言是如此不同!我要补充一点,这只适用于 Octave。
        猜你喜欢
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        相关资源
        最近更新 更多