2012-04-16 7 views
1

私が作業しているコードをベクトル化しようとしていますが、私は一見同等のforループ。なぜ2つのバージョンが異なる結果を得ているのか誰にも見えますか?Matlabでforループをベクトル化して、一見同じコードで別の結果を得る

また、誰かが最初のforループをベクトル化する方法についての指針を持っていれば、甘いだろう各セルのバイナリロケーションマトリックスを生成してください。助けのために非常に多くの

おかげ

Formatted code

平野コード:

function create_distances() 
x=3; % Dimensions of grid 
y=3; 
num_cells=x*y; % Num of cells in grid 

% In following code a matrix is generated for each cell, in which that cell 
% is set to 1 and all others zero. 
locations=zeros(x,y,num_cells); % Initialise blank array to store each location on grid 
for current_index=1:num_cells; 
    temp=locations(:,:,current_index); 
    temp([current_index])=1;% Set a single cell to 1 to represent which cell is the active one for each of the cells 
    locations(:,:,current_index)=temp; % Store back to that location matrix 
end 

%%For loop version which correctly creates the distances 
distances_from_position1=zeros(x,y,num_cells); 
for current_location1=1:num_cells 
    distances_from_position1(:,:,current_location1)=bwdist(locations(:,:,current_location1)); 
end 

% Vectorised version of same code which gives incorrect distance values 
current_location2=1:num_cells; 
distances_from_position2=zeros(x,y,num_cells); 
distances_from_position2(:,:,current_location2)=bwdist(locations(:,:,current_location2)); 

%Gives correct results 
correct_values=distances_from_position1 

%incorrect_values=distances_from_position2; 

if eq(distances_from_position1,distances_from_position2)==1 
    disp('Same results') 
else 
    disp('Two methods give different results') %This message shown each time 
end 

答えて

1

私はコードが同等であるとは思わない: "シーケンシャル" バージョンは、2-Dで距離を発見(スライス内の)空間であるので、x = bwdist(locations(:,:,1)の場合、(3,3)に最も近い非ゼロ要素は(1,1)であり、x(3,3)= sqrt(4 + 4)= 2.8284となります。 (1,1)と(3,3)の間の距離。

一方、「ベクトル化バージョン」では、距離は3-D空間内にあり、x = bwdist(locations(:,:,1:2)の場合、(3,3,1)に最も近い非ゼロ要素は(1,1,1)ではなく( 1,2,1)となるので、x(3,3,1)= sqrt(4 + 1 + 1)= 2.4495となる。

+0

入力していただきありがとうございます。 これは、[ここ(リンク)](http://www.mathworks.co.uk/products/matlab/demos.html?file=/products/demos/shipping/matlab/nddemo.html)に対応しているようです#7): "平面または2D行列で動作するEIGのような関数は、多次元配列を引数として受け入れません。多次元配列の異なる平面にこのような関数を適用するには、indexingまたはFORループを使用してください。 bwdistは2次元行列上で動作するので、それが動作しない理由です。ループ内の距離値を計算する唯一の方法はありますか? ありがとう –

+0

実際には、bwdistは3次元行列上で動作します。*は、ドキュメントに従って正しく動作しています。すなわち、3次元空間内の距離を計算し、2次元行列を互いの上に積み重ねられている。しかし、これはあなたが望むものではないので、私はあなたがループに行かなければならないと思います... – laxxy

関連する問題