Arrays 交替取两个向量的元素并在Matlab中组合

Arrays 交替取两个向量的元素并在Matlab中组合,arrays,matlab,Arrays,Matlab,你能帮我在Matlab中写下一个非常快速的算法吗?它可以实现以下功能:我有2向量,a维度nx1和B维度nx1。我想构造维度2nx1的C,这样 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 你知道更快更有效的方法吗 例如: n=9 A=[1 3 5 7 9 11 13 15 17]'; B=[2 4 6

你能帮我在Matlab中写下一个非常快速的算法吗?它可以实现以下功能:我有
2
向量,
a
维度
nx1
B
维度
nx1
。我想构造维度
2nx1
C
,这样

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
你知道更快更有效的方法吗

例如:

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]';

通常,您希望避免像编写循环那样将数据追加到循环中的数组中,因为每次在展开变量时都必须通过循环重新分配内存

最简单的方法是使用
(:).
将它们转换为行向量,沿第一个维度连接它们,然后使用
重塑
将它们展平为列向量。由于MATLAB的列主顺序,这将自动将
A
B
的值相互保留,以创建
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

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

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

c(2*n,1)=0初始化
c
甚至更快(尽管公认是黑客式的)有趣。。。我不知道。看到链接的帖子了吗@ThP@LuisMendo看来2015b的新执行引擎可能不再是这种情况了。你不想要一个快速的答案吗?我添加了一个显示相对性能的基准。很好。按照路易斯的建议,使用
C(2*n,1)=0进行比较会很有趣Mendo@ThP我比较了一下。几乎没有什么区别。这只是一个微优化,但是下面的速度稍微快一点:C=[A(:)。;B(:)。];C=C(:);`猜测是,这只是一个函数调用(因为与“cat+重塑”相关的差异大约是常量),但如果问题由许多函数调用组成,则可能很重要。