Reputation: 33
I'm trying to vectorise a piece of code I'm working on, but I'm getting strange results that don't happen in a seemingly equivalent for-loop. Can anyone see why the two versions are getting different results?
Also, if anyone has any pointers on how I could vectorise the first for loop, and generate a binary location matrix for each cell that'd be sweet.
Thanks very much for the help
Plain 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
Upvotes: 1
Views: 159
Reputation: 1188
I do not think the code is equivalent: the "sequential" version finds a distance in 2-D space (within the slice), so if x = bwdist(locations(:,:,1)
the closest nonzero element to (3,3) is (1,1), and we have x(3,3) = sqrt(4+4) = 2.8284, ie. distance between (1,1) and (3,3).
On the other hand, with the "vectorized version" the distance is in 3-D space, and if x = bwdist(locations(:,:,1:2)
the closest nonzero element to (3,3,1) is not (1,1,1) but (1,2,1), so then x(3,3,1) = sqrt(4+1+1) = 2.4495.
Upvotes: 1