2017-05-18 14 views
1

このforのループをMATLABの1つのコマンドでどのように置き換えることができるかについて、ここ3Dマトリックス2D行列を使用したインデックス作成

for i = 1 : size(w,3) 
    x=w(:,:,i); 
    w1(i,:)=x(B(i),:); 
end 
clear x 

は、wは、3D(x by y by z)行列及びB(1 by z)はwの各レイヤの行を含むベクターです。このforのループは、wが500000の深さのときに約150秒かかる。私は、これはサイズ500000 X 2 X 500000の行列Qを作成し、MATLABがバウンド外のメモリを言って私にエラーを投げた、使用して

Q = w(B,:,:); 
Q = reshape(Q(1,:),[500000,2])'; 

を試してみました。どんな助けもありがとう!

+0

私の答えはあなたのために機能しましたか?はいの場合は、それを合格とマークしてください。 –

答えて

0

中間変数(例:x)を作成し、forループを使用しています。以下のアプローチの中核をなすアイデアは、まず使用されるインデックスを事前に設定してから、すべての要素に一度にアクセスするために線形インデックスを使用することです。次に、希望する結果を得るために形を変えることができます。私のシステムで

ind = [B(1)*ones(size(w,2),1) (1:size(w,2)).' 1*ones(size(w,2),1)]; 
ind = [ind; [B(2)*ones(size(w,2),1) (1:size(w,2)).' 2*ones(size(w,2),1)]]; 
ind = [ind; [B(3)*ones(size(w,2),1) (1:size(w,2)).' 3*ones(size(w,2),1)]]; 
lin_ind = sub2ind(size(w), ind(:,1), ind(:,2), ind(:,3)); 
w1 = reshape(w(lin_ind),size(w,2),size(w,3)).' 

、これはあなたの質問に与えられたループで計算さw1と一致します。インデックスを事前に設定するには、forループを使用する必要があることに注意してください。私は小さな行列を実験していたので3つの表現を書いています。実際には、最初の3行は、ループを必要とせず、どのサイズでも動作するように記述することができます。私はあなたにそれを残します。

関連する問題