Matlab - 没有得到预期的结果

时间:2013-02-11 08:30:45

标签: matlab for-loop

我编写了一个应该执行以下操作的函数:

  • 作为输入两套
  • 使用pdist2获取两组之间的距离,代码显示为here
  • 一开始就需要两组之间的距离。然后,对于第二集,在每次迭代时,它会将(i,j)位置设置为0并计算与此更改的距离。当进入下一次迭代时,它应该将下一个位置值更改为“0”,同时将之前设置为“0”的值返回到其原始值。 / LI>
  • 请注意,pdist2的结果最初作为矩阵返回,但为了进行比较,我总结了矩阵值以将其用于比较。

基于此,我编写了以下函数(请注意,您可以使用链接here中的pdist2.m函数):

   function m = pixel_minimize_distance(x,y)
    sum1=0;
    sum2=0;
    [r c] = size(y);
    d1 = pdist2(x,y);
    [r1 c1] = size(d1);
    for i=1:r1
    for j=1:c1
        sum1=sum1+d1(i,j);
    end
end
maximum = sum1;

for i=1:r
for j=1:c
o = y(i,j)
y(i,j) = 0;
d2 = pdist2(x,y);
[r2 c2] = size(d2);
for i=1:r2
    for j=1:c2
        sum2=sum2+d2(i,j);
    end
end

if sum2 >= maximum
    if o ~= 0
    maximum = sum2;
    m = o;
    end

end

if sum2 <= maximum
maximum = maximum;
end
y(i,j)=o;
end
end
end

现在,这就是我作为测试运行的内容:

>> A=[1 2 3; 6 5 4];
>> B=[4 5 3; 7 8 1];
>> pixel_minimize_distance(A,B)

o =

     4


o =

     4


o =

     1


o =

     7


o =

     7


o =

     0


ans =

     7

请看这里的答案是7(如果看不到它,请向下滚动),而我手动计算时的预期值应为3,因为我们将其设置为{{ 1}}距离之和为0

知道代码中可能有什么问题吗?我认为它位于设置142的代码中的位置,其中o = y(i,j)表示原始值,但实际上无法找到解决问题的方法。

感谢。

1 个答案:

答案 0 :(得分:2)

我认为您的代码中有许多冗余命令。我刚删除它们,没有别的。我将m的价值定为3。我使用MATLAB的pdist2函数和欧氏距离平方(因为这是你提供的函数中的默认值)。我没有得到142作为距离。

以下是代码:

function m = pixel_minimize_distance(x,y)
[r c] = size(y);
maximum = (sum(sum(pdist2(x,y)))).^2; %explained below

for i=1:r
    for j=1:c
        o = y(i,j);
        y(i,j) = 0
        sum2 = (sum(sum(pdist2(x,y)))).^2;


        if sum2 >= maximum
            if o ~= 0
                maximum = sum2;
                m = o;
            end
        end

        y(i,j)=o;
    end
end
end

,输出为:

y =

 0     5     3
 7     8     1

y =

 4     0     3
 7     8     1

y =

 4     5     0
 7     8     1

y =

 4     5     3
 0     8     1

y =

 4     5     3
 7     0     1

y =

 4     5     3
 7     8     0

m =

 3

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% 说明: 您编写了以下代码段:

d2 = pdist2(x,y);
[r2 c2] = size(d2);
for i=1:r2
    for j=1:c2
        sum2=sum2+d2(i,j);
    end
end

这就是使用pdist2计算两组之间的距离,并总结整个距离矩阵,得出一个存储在sum2中的值。 让我们看看我的代码:

sum2 = (sum(sum(pdist2(x,y)))).^2;

pdist2会给出距离。第一个sum命令将沿着行汇总,然后第二个命令将沿着列总和,以便为矩阵中的所有值提供总数(这是您对两个for循环所做的操作)。现在,.^2背后的原因是: 在您提供的链接中的原始pdist2函数中,您可以从以下代码段中看到:

if( nargin<3 || isempty(metric) ); metric=0; end;

switch metric
  case {0,'sqeuclidean'}

平方欧几里德是默认距离,而在MATLAB中,欧几里德距离是默认距离。因此,我对这个术语进行了平方。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%