你能否帮我在Matlab中写下一个非常快速的算法,它执行以下操作:我有2
个向量,A
维nx1
和B
维度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
答案 0 :(得分:5)
通常,您会希望避免将数据附加到循环中的数组,就像您编写它一样,因为在扩展变量时,必须通过循环每隔时间重新分配内存。
最简单的方法是使用(:).'
将它们转换为行向量,沿第一维连接它们,然后使用reshape
展平为列向量。由于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
答案 1 :(得分:3)
在matlab中,索引操作通常比for循环更快
我要做的是首先构造一个2nx1
矩阵,然后使用索引来分配值:
C = zeros(2*n,1);
C(1:2:end) = A;
C(2:2:end) = B;