【问题标题】:Boost loop performance when reshaping huge amount of data重塑大量数据时提高循环性能
【发布时间】:2017-08-27 03:25:27
【问题描述】:

这是上一个问题here 的扩展问题。我正在根据下面的代码重塑数据。但是,当数据量增加时,in=rand(291081,1920);,上一个问题中的答案(预分配)无法再处理了,MATLAB 甚至冻结了整个笔记本电脑。因此,正如 Teddy 在上一个问题中所建议的那样,我要提出一个新问题来提高循环的性能。

可以找到一些非常相似但不相似的问题here。从那里,给出的答案建议将循环修改为按列。但是,由于我的循环需要同时访问行和列,所以答案似乎不适用于我的情况。

是否仍可以修改此循环以提高其性能?或者可以在不冻结整个笔记本电脑的情况下完成这个循环吗?如果可能,不要涉及 GPU。

in=rand(291081,1920);
m=581;
[R,C]=size(in); 
R_out=R/m; 

out=zeros(m*C,R_out);
for k=1:m %from row 1 to nth row
    for i=1:C %reshape every column of nth row
        out(i+C*(k-1),:) = in(k:m:end,i)';
    end
end

P/S:在上一个问题中,当数据量变大时,循环和arrayfun似乎没有太大的性能差异。

提前致谢!

【问题讨论】:

    标签: matlab performance for-loop optimization


    【解决方案1】:

    首先,感谢@NLindros 提供的答案,这启发了这个答案。似乎使用 reshape 是迄今为止处理大量数据的最有效方法。因此,为避免按照建议使用转置,使用permutereshape,如下所示。

    out=reshape(permute(reshape(in,m,R_out,[]),[1 3 2]),[],R_out);

    这是迄今为止最快的重塑方式。

    如果没有更好的答案,我会将此标记为答案。

    【讨论】:

      【解决方案2】:

      你可以transpose你的矩阵和reshape它只有R_outcolumns。

      % Input
      in=rand(291081,1920);
      m=581;
      [R,C]=size(in); 
      R_out=R/m; 
      
      % Reshape
      out = reshape(in.', [], R_out);
      

      此操作所需的大部分时间是由in 矩阵的转置引起的。因此,为了进一步加快速度,您也许可以尝试收集/提供数据,以便它已经被转置,然后进行重塑。

      【讨论】:

        猜你喜欢
        • 2020-08-25
        • 1970-01-01
        • 2013-01-29
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        • 2014-07-13
        相关资源
        最近更新 更多