取两个向量的元素并在Matlab中组合它们

use*_*148 0 arrays matlab

你能不能帮我在Matlab中写下一个非常快速的算法,它执行以下操作:我有维度和维度的2向量.我想构建尺寸,使得Anx1Bnx1C2nx1

C(1)=A(1), C(2)=B(1), C(3)=A(2), C(4)=B(2), C(5)=A(3), C(6)=B(3), ... 
Run Code Online (Sandbox Code Playgroud)

我虽然关于

C=[];
for j=1:n
    C=[C; [A(j) B(j)]'];
end
Run Code Online (Sandbox Code Playgroud)

你知道更快更有效的事情吗?

例:

n=9
A=[1 3 5 7 9 11 13 15 17]';
B=[2 4 6 8 10 12 14 16 18]';
C=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]';
Run Code Online (Sandbox Code Playgroud)

Sue*_*ver 5

通常,您会希望避免将数据附加到循环中的数组,就像您编写它一样,因为在扩展变量时,每次循环时都必须重新分配内存.

最简单的方法是使用它们将它们转换为行向量(:).',沿第一维连接它们,然后使用将它们展平为列向量reshape.由于MATLAB的列主要排序,这将自动交叉保留AB创建的值C.

C = reshape(cat(1, A(:).', B(:).'), [], 1)
Run Code Online (Sandbox Code Playgroud)

基准

至于这是否比索引更快(@ThP的答案),这里是一个简短的测试来对这两者进行基准测试.

sizes = round(linspace(100, 10000, 100));

times1 = zeros(size(sizes));
times2 = zeros(size(sizes));

for k = 1:numel(sizes)
    A = rand(sizes(k), 1);
    B = rand(sizes(k), 1);

    times1(k) = timeit(@()combine1(A,B));
    times2(k) = timeit(@()combine2(A,B));
end

figure
plot(sizes, times1)
hold on
plot(sizes, times2)
legend('cat + reshape', 'Indexing')

function C = combine1(A, B)
    C = reshape(cat(1, A(:).', B(:).'), [], 1);
end

function C = combine2(A,B)
    C = zeros(2*numel(A),1);
    C(1:2:end) = A;
    C(2:2:end) = B;
end
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述