有效地重塑(交替)数千个数据的方法

时间:2017-03-22 05:40:50

标签: matlab reshape

我有一个非常大的数据集,数千行和数百列。我尝试交替重塑每第n行和所有第n行列数据的数据。我试过这样:

in=rand(71760,320);
m=240; n=320;
[R,C]=size(in); 
out=[];
R_out=R/m; 

for k=1:m %from row 1 to mth row
    for i=1:C %reshape every column of mth row
        out=[out;reshape(in(k:m:end,i),R_out,1)'];
    end
end

如果您尝试使用该代码,则需要花费很长时间而且效率不高,您甚至不愿意让它完成。如何提高性能?或者有更好的方法来做到这一点?

更新

此问题已扩展至另一个帖子here,以提高@Teddy提供的重塑答案的效果

1 个答案:

答案 0 :(得分:3)

需要这么长时间的原因是out矩阵应为preallocated

例如,这在我的笔记本电脑上大约1秒钟完成:

in=rand(71760,320);
m=240; n=320;
[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

替代方法

最佳做法是使用arrayfun的矢量化方法,可以在一行中完成,如下所示:

out=cell2mat(arrayfun(@(k) in(k:m:end,:)', 1:m,'uniformoutput',0)');

这也运行得更快。