私が作業しているコードをベクトル化しようとしていますが、私は一見同等のforループ。なぜ2つのバージョンが異なる結果を得ているのか誰にも見えますか?Matlabでforループをベクトル化して、一見同じコードで別の結果を得る
また、誰かが最初のforループをベクトル化する方法についての指針を持っていれば、甘いだろう各セルのバイナリロケーションマトリックスを生成してください。助けのために非常に多くの
おかげ
平野コード:
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
入力していただきありがとうございます。 これは、[ここ(リンク)](http://www.mathworks.co.uk/products/matlab/demos.html?file=/products/demos/shipping/matlab/nddemo.html)に対応しているようです#7): "平面または2D行列で動作するEIGのような関数は、多次元配列を引数として受け入れません。多次元配列の異なる平面にこのような関数を適用するには、indexingまたはFORループを使用してください。 bwdistは2次元行列上で動作するので、それが動作しない理由です。ループ内の距離値を計算する唯一の方法はありますか? ありがとう –
実際には、bwdistは3次元行列上で動作します。*は、ドキュメントに従って正しく動作しています。すなわち、3次元空間内の距離を計算し、2次元行列を互いの上に積み重ねられている。しかし、これはあなたが望むものではないので、私はあなたがループに行かなければならないと思います... – laxxy