重塑大量数据时提升循环性能

时间:2017-04-02 04:39:20

标签: matlab performance for-loop optimization

这是前一个问题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似乎没有很大的性能差异。

提前致谢!

2 个答案:

答案 0 :(得分:3)

您可以transpose矩阵,reshape只有R_out列。

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

% Reshape
out = reshape(in.', [], R_out);

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

答案 1 :(得分:0)

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

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

到目前为止,这是重塑的最快方式。

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