-1

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

  • 将两组作为输入
  • 使用此处pdist2显示的代码计算两组之间的距离。
  • 开始时会占用两组之间的距离。然后,对于第二组,在每次迭代中,它将 (i,j) 位置设置为0并计算此更改的距离。一个,当它进入下一次迭代时,它应该将下一个位置值更改为'0',同时将之前设置为'0'的值返回到它的原始值
  • 请注意,pdist2最初返回的结果作为矩阵返回,但为了比较,我将矩阵值相加以用于比较。

基于此,我编写了以下函数(请注意,您可以使用此处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,因为当我们将它设置为0距离的总和时将是142

知道代码中可能有什么问题吗?我认为它会在设置o = y(i,j)whereo表示原始值的代码中的位置,但真的想不出解决这个问题的方法。

谢谢。

4

1 回答 1

2

我认为您的代码中有许多冗余命令。我只是删除了它们,没有别的。我得到了mas的价值3。我使用了具有平方欧几里得距离的 MATLABpdist2函数(因为这是您提供的函数中的默认值)。我没有得到 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

米=

 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 中,欧几里得距离是默认距离。因此,我对这个词进行了平方。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

于 2013-02-11T09:25:08.490 回答