我编写了一个应该执行以下操作的函数:
pdist2
获取两组之间的距离,代码显示为here。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)
表示原始值,但实际上无法找到解决问题的方法。
感谢。
答案 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中,欧几里德距离是默认距离。因此,我对这个术语进行了平方。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%