【问题标题】:Vectorizing randi() function in MatlabMatlab中的矢量化randi()函数
【发布时间】:2014-09-05 23:45:57
【问题描述】:

我希望能够进一步矢量化以下代码以尝试删除 for 循环:

A = randi(5,1,100);
for X = unique(A)
    B(A==X) = sum(randi(17,sum(A==X),X),2);
end

基本上,它将 1 到 5(由 A 指定)随机数相加 1 到 17,100 次。这发生了多次,B 在接下来的迭代中被替换为A。循环的数量随着每一步呈指数增长,我需要进行 10^9 次试验而不是 100 次,所以我想尽可能多地删除。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 您无法将其向量化,因为B 在每次迭代中都会不断发生变异。但是,如果您喜欢使用 arrayfun/cellfun,则可以将其制成一个包含每次迭代的元素的 5 元素元胞数组,但这本身就较慢。查看这篇文章了解更多详情:stackoverflow.com/questions/12522888/…

标签: matlab loops random iteration vectorization


【解决方案1】:

在我看来,您的代码已经非常高效了。

以下是矢量化方法(使用bsxfun),但代价是需要更多内存和更多计算。基本上,它总是将 5 个数字相加,其中一些以前被设为 0。我怀疑它会比你的更快:

A = randi(5,1,100e4);
B = sum(randi(17, 5, 100e4) .* bsxfun(@le, (1:5).', A));

【讨论】:

  • 不错。我想不出一种矢量化的方式来做到这一点。同意for 循环方法可能更快。
  • 我用这个重写了程序,两者的速度比为5.44,我的代码更快。不过我真的很喜欢你的想法,这是有道理的。我尝试使用 bsxfun,但我想编写自己的输入函数(根本不起作用)。
  • 另外,在仔细查看编译器之后,所有额外的时间都来自一行:sum(randi(20,2000,100000).*bsxfun(@le,(1:2000).',A)); 编译花了将近 10 分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多