在Matlab中对for循环进行矢量化,得到看似等效的代码的不同结果

时间:2012-04-16 00:30:36

标签: matlab vector vectorization

我正在尝试使用我正在处理的一段代码,但是我得到了一些奇怪的结果,这些结果在看似等效的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 个答案:

答案 0 :(得分:1)

我不认为代码是等价的:"顺序" version在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。