我想在MATLAB中交织两个向量。事实上,我实际上只想在每个元素之间添加一个零,但我想我会以这样的方式提出问题,以便我学会如何将其应用于其他情况。
我的具体申请:
我想要一个向量(例如[1 2 3]
)并输出[0 1 0 2 0 3]
。
更广泛的问题:
我将如何使用两个不同的向量,例如[1 2 3]
和[9 8 7]
交织以生成[9 1 8 2 7 3]
。
在上述任何一个或两个问题中,我们非常感谢任何帮助。
答案 0 :(得分:29)
我将利用MATLAB向量的内部布局:它们存储在列主要中,即列中的值变化最快。要交错两个向量a
和b
,只需执行以下操作:
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
答案 1 :(得分:11)
尝试
reshape([[9 8 7];[1 2 3]],1,[])
答案 2 :(得分:9)
以下是一些可以实现您想要的代码:
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
之前,您应确保它是行向量。
答案 3 :(得分:4)
我在文件交换站点(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]
答案 4 :(得分:4)
对于最简单的情况,这是一个非常优雅的"如this answer中所述,使用单线程的解决方案来解决类似的问题。
a = [9 8 7];
b = [1 2 3];
output = kron(a, [1 0]) + kron(b, [0 1]);
正如答案中所述,请注意,效率较低但是可能用于更通用而不仅仅是交错,因为它使用的是Kronecker product在两个矩阵之间有明确的定义。
答案 5 :(得分:1)
Octave是MatLab的免费的开源反向工程,其功能和语言在大多数情况下是相同的。但是,如果您发现自己使用Octave进行编码,则可以使用下面的方法来交织两个(实值的)行向量x
和y
:
[x;y](:)'
注意:这是Octave代码,在MatLab中不起作用。