【问题标题】:Replacing the colon operator with an equivalent vectorizable solution用等效的可矢量化解决方案替换冒号运算符
【发布时间】:2014-11-13 02:39:12
【问题描述】:

我当前的代码是这样的:

for offset = 0:0.9:max_offset :
    x = offset:step_size:max_value;

    [...]

end

我想对 for 循环进行矢量化并删除以使其更快,但如果我尝试将 offset 设为矢量,则第二行的冒号运算符相当于做

x = offset(1):step_size:max_value;

达到预期结果的最有效方法是什么,即得到

x = [ 0:step_size:max_value;
      0.9:step_size:max_value;
      1.8:step_size:max_value; ... ]

假设我不知道max_offset,因此我想要x 中的行数长度?

【问题讨论】:

  • 由于 x 的长度会因迭代而异,因此您不能将所有 x 存储为矩阵形式,这主要意味着使用元胞数组,这对性能没有帮助,除非您实际上想要xcells。因此,您必须设法使循环内的其余代码高效。

标签: matlab octave


【解决方案1】:

由于每个向量的大小不同,它们不会轻易放入矩阵中。您必须将它们放在一个元胞数组中,如下所示:

offset=0:.9:max_offset;
x=arrayfun(@(k) k:step_size:max_value,offset,'UniformOutput',false)

而不是通过x(i,:) 引用x 的行来获取矩阵,您可以使用x{i} 来获取正确的向量。

【讨论】:

  • 这比只保留for循环更快吗?
  • 我不确定。对于较小的问题,它可能是,但性能不太可能有太大差异。其实,我只是想到了另一种方法。执行x=0:step_size:max_value,而不是获取x 矩阵的i-th 行x(i,:),您只需执行x(i:end) 即可获得所需的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多