Interweaving vectors

前端 未结 6 1042
傲寒
傲寒 2020-12-06 01:00

I would like to interweave two vectors in MATLAB. In fact, I\'d actually just like to add a zero between each element, but I figured I\'d ask the question in such a way that

相关标签:
6条回答
  • 2020-12-06 01:17

    Here's some code that will accomplish what you want:

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

    The output is the following:

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

    Following the style of the other two answers, you could get your desired zeros output with the following:

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

    Obviously, nums should be replaced with the vector you'd like to use. As mentioned, you should make sure it's a row vector before calling reshape.

    0 讨论(0)
  • 2020-12-06 01:20

    Octave is a free, open source reverse engineering of MatLab where the functionality and language are the same in most cases. However, if you find yourself coding in Octave, you can use the below to interleave two (real valued) row vectors x and y:

    [x;y](:)'
    

    Caveat: this is Octave code and doesn't work in MatLab.

    0 讨论(0)
  • 2020-12-06 01:26

    I wrote a MATLAB function that's on the File Exchange site (Interleave Vectors or Matrices) that does exactly what you want and more. Just download the .m file and put the file in the same directory as your other .m files, or copy and paste the function into your program.

    This function interleaves any number of vectors or matrices by row or column. If the input are just vectors, there is no need to specify orientation. Extra elements/rows/columns are appended on the end of the output matrix. The other answers provided are very specific for vectors of equal length or require making sure the orientation of vectors is correct.

    Examples of how to use the function:

    1) Interleaving rows of matrices

    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) Interleaving columns of matrices

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

    3) Interleaving vectors (Note: input vectors need not be same orientation)

    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) Interleaving >2 matrices

    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) Interleaving columns of 2 matrices with unequal columns

    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) Interleaving >2 vectors of unequal lengths

    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]
    
    0 讨论(0)
  • 2020-12-06 01:29

    I'd make use of the internal layout of MATLAB vectors: They are stored column-major, that is, values in a column change fastest. To interleave two vectors a and b, simply do:

    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
    
    0 讨论(0)
  • 2020-12-06 01:31

    For the most simple case there's a quite "elegant" solution with a one-liner as described in this answer to a similar question.

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

    As stated in the answer be aware that this is less efficient however might serve for a more general purpose than just interleaving as it uses the Kronecker product that is well-defined between two matrices.

    0 讨论(0)
  • Try

    reshape([[9 8 7];[1 2 3]],1,[])
    
    0 讨论(0)
提交回复
热议问题