2017-04-02 13 views
0

これは前の質問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

まず、この回答に影響を与えた答えを提供してくれたありがとうございました。@NLindrosそれは、今のところ、巨大なデータを処理する最も効率的な方法です。したがって、以下のように、転置の使用を避けるために、permuteおよびreshapeが使用されます。はるかに

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

これは、再構築する最速の方法です。

これ以上の回答がない場合は、これを回答としてマークします。

2

あなたはtransposeの行列であり、reshapeR_outの列しか持てません。

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

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

この操作に必要な時間のほとんどは、in行列の移調によって引き起こされます。それで、それをさらに速くするためには、すでにデータが転置されているようにデータを収集/フィードしてから、その形を変えてみてください。

関連する問題