在matlab中有效地置换矢量

时间:2014-08-06 16:55:40

标签: matlab random permutation

我想在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秒。有没有办法更有效地做到这一点?

2 个答案:

答案 0 :(得分:1)

问题1 - 覆盖循环内的原始向量

每次A = A(n);将覆盖A输入向量,并使用新的排列。这个可能是合理的,因为无论如何你不需要 order ,而是A中的所有元素。但是,它非常低效,因为您必须在每次迭代中重写一个百万元素数组。

解决方案:将排列存储到 new 变量 -

B(ii, :) = A(n);

问题2 - 使用i作为迭代器

我们Stackoverflow总是告诉严肃的Matlab用户,使用ij作为循环中的交互者绝对是个坏主意。检查this answer,看看为什么它会让您的代码变慢,并检查该页面中的其他答案,了解其原因。

解决方案 - 使用ii代替i

问题3 - 使用不必要的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个排列。