【发布时间】:2014-03-19 18:37:37
【问题描述】:
在 matlab 中,我想要一个 3D 矩阵,其随机数沿第 3 维是唯一的,就像这段代码一样:
M = 2; N = 10; L = 5; K = 100;
mat = zeros([M N L]);
for ii=1:M
for jj=1:N
mat(ii,jj,:) = randperm(K,L);
end
end
但是,当矩阵较大时,计算时间会增加很多。因此,我想用任何矢量化删除循环。我想不出有什么办法,有可能吗?
感谢您的帮助。
编辑:我已经在这个script 中运行了几种矩阵大小的所有方法,结果如下:
另外,数字的分布是:
因此,@Luis Mendo 的实现可以更好地适应低 L 值,这是我的情况。但是,@Rody Oldenhuis 优化的提案与 L 值快速相互依赖。因此,一个组合解决方案可能是:
function mat = assignPermMatrix_comb(M,N,L,K)
R = M*N;
mat = zeros([L R]);
if L<K*0.15
ind = true(1,R);
while R
mat(:,ind) = randi(K, L, R);
ind = any(diff(sort(mat))==0);
R = nnz(ind);
end
else
for ii=1:R
mat(:,ii) = randperm(K,L);
end
end
mat = reshape(mat.', [M N L]);
end
我非常感谢您在答案中付出的所有努力。
【问题讨论】:
-
看看我的最新编辑。你能测试一下 Luis 的方法和我的方法吗?我现在很好奇它们如何在较新的 MATLAB 版本上进行比较:)
-
您现在可以在更新后的问题中看到比较。 Luis 的代码似乎更快。无论如何,非常感谢您的时间和兴趣。
-
感谢您进行比较。请注意,运行时间结果对使用的数字很敏感。例如,如果 K 不够大于 L,我的方法将受到影响
-
我必须说,我完全搞不懂为什么我的“优化”解决方案总是比原来的差,甚至比
arrayfun...sort带有两个参数randperm?您使用的是哪个版本的 MATLAB?你的硬件是什么? -
另外,看看分布,我似乎在 Fisher/Yates 实现中犯了一个错误……你碰巧发现了那个错误吗?
标签: matlab bigdata vectorization