2017-07-29 7 views
1

各行に画像座標ペアを保持する座標ベクトルcomp_pointsがあります。今度は、配列comp_windowsnxm -windowsの座標を中心にcomp_pointsの配列で作成したいと思います。これらのウィンドウは、第3次元のcomp_windowsに沿って整列されます。 私はこのような課題を解決した:今、私は連結またはインデックス表現か何かを使用してfor -loopせずにこれを行うことができますように私は感じるが、私はそれを把握することはできませんにベクトルをベクトル化して座標ベクトルから座標ウィンドウを構成する3次元配列を作成する

I2=randi([0 255],[500 500]); 
comp_points=randi([10 490],[20 2]); 
delta_u_window=5; 
delta_v_window=5; 
for ii=1:size(comp_points,1) 
    comp_windows(:,:,ii)=I2(... 
     comp_points(ii,1)-delta_u_window:... 
     comp_points(ii,1)+delta_u_window,... 
     comp_points(ii,2)-delta_v_window:... 
     comp_points(ii,2)+delta_v_window); 
end 

答えて

3

すでに計算をしていないslicingという操作があります。 permute愛好家のために

% Get range arrays 
r1 = [-delta_u_window : delta_u_window]; 
r2 = [-delta_v_window : delta_v_window]; 

% Get row and column indices for all points in comp_points 
r = bsxfun(@plus,r1(:),comp_points(:,1).'); 
c = bsxfun(@plus,r2(:),comp_points(:,2).'); 

% Next up, the work is to combine those row and column indices in a meshed-way 

% Get 3D version of r and c - Keeping their last dim aligned and "spreading 
% out" their first dims against each others. Then, perform elementwise 
% summations to give us a summed up array of indices, indexing into which 
% would give us the desired output. 
r3D = reshape(r,size(r,1),1,[]); 
c3D = reshape((c-1)*size(I2,1),1,size(c,1),[]); 
out = I2(bsxfun(@plus, r3D, c3D)); 

、我々はそうのように、単一のもので最後の3つの手順を置き換えることができます - だから、私はそれをベクトル化、しかしのはbsxfunから大きな助けにとにかくそれを出してみましょうする価値があるかどうかわからないです -

I2(bsxfun(@plus, permute(r,[1,3,2]), permute((c-1)* size(I2,1),[3,1,2]))) 
+0

聖なる地獄。ベクトル化する価値はありますか?オクターブでは、解は* 0.005 *秒で実行され、forループは* 0.3 *秒で実行されます。私はarrayfunをベースにしたソリューションだが、それでもまだ0.3 *であった。あなたに私の帽子のヒント。これは美しく正しいコードです。 – Ash

+0

@Ashうわー、よく私はここでベクトル化の力を過小評価したと思います!ベンチマークとフィードバックはもちろんありがとう! – Divakar

+1

wooops、忘れて、このタイミングは* 10^4 *ポイントに相当します。 – Ash

関連する問題