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

时间:2016-06-01 16:43:16

标签: arrays matlab

你能否帮我在Matlab中写下一个非常快速的算法,它执行以下操作:我有2个向量,Anx1B维度nx1。我想构建维度C的{​​{1}},以便

2nx1

我虽然关于

C(1)=A(1), C(2)=B(1), C(3)=A(2), C(4)=B(2), C(5)=A(3), C(6)=B(3), ... 

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

示例:

C=[];
for j=1:n
    C=[C; [A(j) B(j)]'];
end

2 个答案:

答案 0 :(得分:5)

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

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

C = reshape(cat(1, A(:).', B(:).'), [], 1)

基准

至于这是否比索引更快(@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

enter image description here

答案 1 :(得分:3)

在matlab中,索引操作通常比for循环更快 我要做的是首先构造一个2nx1矩阵,然后使用索引来分配值:

C = zeros(2*n,1);
C(1:2:end) = A;
C(2:2:end) = B;