2017-04-02 36 views
0

这是来自上一个问题here的扩展问题。我正在根据下面的代码重塑数据。但是,当数据量增加时,上一个问题中的答案(预分配)不能再处理了,MATLAB甚至冻结了整个笔记本电脑。因此,正如泰迪在最后一个问题中提出的那样,我提出了一个新问题来提高循环的性能。重塑海量数据时提升循环性能

可以找到一些非常相似但不相似的问题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似乎没有大的性能差异。

在此先感谢!

回答

0

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

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

这远远是重塑最快的方式。

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

2

你可以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矩阵转置造成的。所以为了进一步加快你的速度,你也许可以尝试收集/提供数据,以便它已经转置,然后进行重构。