Matlab 重塑海量数据时提高循环性能
这是上一个问题的延伸问题。我正在根据下面的代码重塑数据。然而,当数据大小增加时,Matlab 重塑海量数据时提高循环性能,matlab,performance,for-loop,optimization,Matlab,Performance,For Loop,Optimization,这是上一个问题的延伸问题。我正在根据下面的代码重塑数据。然而,当数据大小增加时,in=rand(2910811920),上一个问题的答案(预分配)无法处理,MATLAB甚至冻结了整个笔记本电脑。因此,正如Teddy在最后一个问题中所建议的那样,我将打开一个新问题来提高循环的性能 可以找到一些非常相似但不相似的问题。因此,给出的答案建议将循环修改为列式。然而,由于我的循环需要同时访问行和列,所以答案似乎不适用于我的情况 是否仍可以修改此循环以提高其性能?或者这个循环可以在不冻结整个笔记本电脑的情况
in=rand(2910811920)代码>,上一个问题的答案(预分配)无法处理,MATLAB甚至冻结了整个笔记本电脑。因此,正如Teddy在最后一个问题中所建议的那样,我将打开一个新问题来提高循环的性能
可以找到一些非常相似但不相似的问题。因此,给出的答案建议将循环修改为列式。然而,由于我的循环需要同时访问行和列,所以答案似乎不适用于我的情况
是否仍可以修改此循环以提高其性能?或者这个循环可以在不冻结整个笔记本电脑的情况下完成吗?如果可能,不涉及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
似乎没有太大的性能差异
提前谢谢 您可以创建矩阵,使其只包含R\u out
列
% Input
in=rand(291081,1920);
m=581;
[R,C]=size(in);
R_out=R/m;
% Reshape
out = reshape(in.', [], R_out);
此操作所需的大部分时间是由矩阵中的换位引起的。因此,为了进一步加速upp,您可以尝试收集/馈送数据,使其已被转置,然后只需进行重塑。首先,感谢您提供的答案,这启发了这个答案。似乎使用重塑是迄今为止处理海量数据最有效的方法。因此,为了避免使用建议的转置,使用了permute
和reformate
,如下所示
out=重塑(排列(重塑(in,m,R_-out,[]),[1,3,2]),[],R_-out)代码>
这是迄今为止最快的重塑方式
如果没有更好的答案,我会把这个标记为答案