这是前一个问题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
似乎没有很大的性能差异。
提前致谢!
答案 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提供答案,这启发了这个答案。似乎使用重塑是迄今为止处理大量数据的最有效方法。因此,为了避免使用转置,建议使用permute
和reshape
,如下所示。
out=reshape(permute(reshape(in,m,R_out,[]),[1 3 2]),[],R_out);
到目前为止,这是重塑的最快方式。
如果没有更好的答案,我会将此标记为答案。