MATLAB以不同方式随机排列列
Posted
技术标签:
【中文标题】MATLAB以不同方式随机排列列【英文标题】:MATLAB randomly permuting columns differently 【发布时间】:2015-05-23 06:56:45 【问题描述】:我有一个非常大的矩阵 A,有 N 行和 M 列。我想基本上做以下操作
for k = 1:N
A(k,:) = A(k,randperm(M));
end
但快速有效。 (M和N都很大,这只是一个更大的外循环中的一个内循环。)
更多上下文:我正在尝试对相关矩阵 (http://en.wikipedia.org/wiki/Resampling_%28statistics%29) 实施置换测试。我的数据非常大,我很不耐烦。如果有人知道实施此类测试的快速方法,我也将不胜感激听到您的意见!
我有没有希望避免在循环中这样做?
抱歉,如果这已经被问到了。谢谢!
【问题讨论】:
【参考方案1】:如果你输入 open randperm
(至少在 Matlab R2010b 中),你会看到它的输出 p
输入 M
只是
[~, p] = sort(rand(1,M));
所以,要对 N
行进行矢量化,
[~, P] = sort(rand(N,M), 2);
因此,生成P
并将linear indexing 用于A
:
[~, P] = sort(rand(N,M), 2);
A = A(bsxfun(@plus, (1:N).', (P-1)*N));
例子:给定
N = 3;
M = 4;
A = [ 1 2 3 4
5 6 7 8
9 10 11 12 ];
一个(随机)结果是
A =
2 3 1 4
7 5 8 6
9 11 12 10
【讨论】:
很高兴它成功了!那很简单 :-) 我想知道为什么randperm
不能以这种方式一次生成多个排列
同意,似乎是一个非常简单的扩展!
请注意,使用此方法的冲突概率非零:即如果rand
的输出中有重复数字怎么办?此外,生成这样的 NxM 矩阵具有 O(N M log(M)) 时间复杂度,而不是最佳 O(N M)。见en.wikipedia.org/wiki/Shuffling#Shuffling_algorithms
输出中有重复的数字不是问题。 sort
只会保持它们的相对顺序以产生输出以上是关于MATLAB以不同方式随机排列列的主要内容,如果未能解决你的问题,请参考以下文章
以随机顺序重新排列NSArray / MSMutableArray