我想在matlab中对一个向量进行1000次随机排列。我是这样做的
% vector is A
num_A = length(A);
for i=1:1000
n = randperm(num_A);
A = A(n); % This is one permutation
end
这需要73秒。有没有办法更有效地做到这一点?
答案 0 :(得分:1)
每次A = A(n);
将覆盖A
输入向量,并使用新的排列。这个可能是合理的,因为无论如何你不需要 order ,而是A
中的所有元素。但是,它非常低效,因为您必须在每次迭代中重写一个百万元素数组。
解决方案:将排列存储到 new 变量 -
B(ii, :) = A(n);
i
作为迭代器我们Stackoverflow总是告诉严肃的Matlab用户,使用i
和j
作为循环中的交互者绝对是个坏主意。检查this answer,看看为什么它会让您的代码变慢,并检查该页面中的其他答案,了解其原因。
解决方案 - 使用ii
代替i
。
for
循环实际上你可以完全避免这个for
循环,因为迭代不是彼此相关的,如果允许Matlab进行并行计算,它会更快。
解决方案 - 使用arrayfun
一次生成1000个结果。
使用arrayfun
生成1000 x num_A
个索引。我认为(没有确认)它比直接访问A
更快。
n = cell2mat(arrayfun(@(x) randperm(num_A), 1:1000', 'UniformOutput', false)');
然后将所有1000个排列一次存储到一个新变量中。
B = A(n);
我发现this code很有吸引力。您可以将randperm
替换为Shuffle
。示例代码 -
B = Shuffle(repmat(A, 1000, 1), 2);
答案 1 :(得分:0)
A = perms(num_A)
A = A(1:1000)
Perms会返回所有不同的排列,只需先取1000个排列。