Matlab 交织向量

Matlab 交织向量,matlab,vector,Matlab,Vector,我想在MATLAB中交织两个向量。事实上,我只是想在每个元素之间加一个零,但我想我会以这样一种方式提问,这样我就可以学会如何将它应用到其他情况 我的具体申请: 我想取一个向量(例如[1 2 3])并输出[0 1 0 2 0 3] 更广泛的问题是: 我将如何使用两个不同的向量,例如[1 2 3]和[9 8 7]交织生成[9 1 8 2 7 3] 非常感谢您对上述任一问题或两个问题的帮助。请尝试 reshape([[9 8 7];[1 2 3]],1,[]) 以下是一些可以实现您所需的代码: nu

我想在MATLAB中交织两个向量。事实上,我只是想在每个元素之间加一个零,但我想我会以这样一种方式提问,这样我就可以学会如何将它应用到其他情况

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

更广泛的问题是: 我将如何使用两个不同的向量,例如
[1 2 3]
[9 8 7]
交织生成
[9 1 8 2 7 3]

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

请尝试

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

以下是一些可以实现您所需的代码:

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 =

    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
应该替换为您想要使用的向量。如前所述,在调用
重塑

之前,您应该确保它是一个行向量。我会利用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

我在文件交换站点()上编写了一个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]
C = interleave2(A, B, 'col') 
C = [1 5 2 6 
     3 7 4 8]
2) 矩阵的交错列

A = [1 2; 3 4] B = [5 6;7 8]

C = interleave2(A, B, 'row') 
C = [1 2 
     5 6 
     3 4 
     7 8]
C = interleave2(A, B, 'col') 
C = [1 5 2 6 
     3 7 4 8]
3) 交错矢量(注:输入矢量不需要相同方向)

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) 交错两个矩阵的列,列不相等

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]

对于最简单的情况,有一个非常“优雅”的解决方案,使用一行程序,如类似问题的第1部分所述

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

如回答中所述,请注意,这效率较低,但可能比交错更通用,因为它使用两个矩阵之间定义明确的音阶。

倍频程是自由音阶,MatLab的开源逆向工程,在大多数情况下功能和语言相同。但是,如果您发现自己使用倍频程编码,则可以使用以下命令交错两个(实值)行向量
x
y

[x;y](:)'

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

为了保证它是一个行向量,您可以编写
nums(:)'
这个
重塑
解决方案非常优雅!琐碎,但要使其返回行向量,当然可以这样更改最后一行:
c=a(:)
使用
而不是
,否则它将无法处理复数。我非常喜欢此解决方案,但查看文档,我看不出该函数在所有输入或函数的未来实现中都会以这种方式运行。特别是,它似乎只能保证:“整形(X,SIZ)返回一个N-D数组,该数组的元素与X相同,但被整形为大小SIZ。”@JacobLee:reformate的使用是安全的。第一个参数是一个矩阵,紧跟在1之后,一个鞋带固定器总是将形状改为1xn。一个更通用的用于行和列输入的版本是
reforme([a(:)。;B(:)。],1,[])
不做复数。如果向量长度不同,则不起作用。不检查输入是否为行向量。等等。但是,如果您不担心这些情况,并且您需要一些高效的编写和运行工具,那么就是它了。@gnovice是的,我用八度编码。我不知道语言有那么不同!我要补充一点,这只适用于八度音阶。