Matlab 在循环内的向量中保存值,并查找保存某个元素的特定循环
我有一个代码,它通过离散t计算两条线段之间的最小距离,s在0和1之间用h计算。该代码将保存向量中s和t的每个值的距离,并在末尾拾取最小值 我想找到对应的t和s,它的最小距离出现了。例如,如果最小距离位于“Minist”向量中的索引3000处,那么t和s的哪个值对应 提前谢谢! /阿里安 编辑:我还提供了完整的代码和一些注释。我改变了一点,这似乎起到了作用:Matlab 在循环内的向量中保存值,并查找保存某个元素的特定循环,matlab,loops,for-loop,indexing,location,Matlab,Loops,For Loop,Indexing,Location,我有一个代码,它通过离散t计算两条线段之间的最小距离,s在0和1之间用h计算。该代码将保存向量中s和t的每个值的距离,并在末尾拾取最小值 我想找到对应的t和s,它的最小距离出现了。例如,如果最小距离位于“Minist”向量中的索引3000处,那么t和s的哪个值对应 提前谢谢! /阿里安 编辑:我还提供了完整的代码和一些注释。我改变了一点,这似乎起到了作用: % Start and end points of line segments P0=[-0.43256 -1.6656 0.12533];
% Start and end points of line segments
P0=[-0.43256 -1.6656 0.12533];
P1=[0.28768 -1.1465 1.1909];
Q0=[1.1892 -0.037633 0.32729];
Q1=[0.17464 -0.18671 0.72579];
% Direction vectors
u=P1-P0;
v=Q1-Q0;
w0=P0-Q0;
% Dot products
a=dot(u,u);
b=dot(u,v);
c=dot(v,v);
d=dot(u,w0);
e=dot(v,w0);
F=a*c-b^2;
h=0.01;
t=0:h:1;
s=0:h:1;
mindist=[];
for i=1:length(t)
for j=1:length(s)
if F==0
t(i)=e/c;
mindist(i,j)=norm((P0+s(j)*u)-(Q0+t(i)*v));
else
mindist(i,j)=norm((P0+s(j)*u)-(Q0+t(i)*v));
end
end
end
[minval,loc]=min(mindist(:));
[i, j] = ind2sub(size(mindist), loc);
minval=norm((P0+s(j)*u)-(Q0+t(i)*v))
明瓦尔=
1.0710
由于Matlab的
pdist2()
函数,您不需要嵌套循环。以下是一个例子:
h=0.01;
% Random vectors
P0 = [0;0];
Q0 = [0;2];
u = [1;0];
v = [0.707 ; -0.707];
t = 0:h:1; % Do not really need "s"
U = P0+t.*u;
V = Q0+t.*v;
% The lines above work in Matlab 2016b and beyond. For older versions use:
% U = P0 + [t.*u(1) ; t.*u(2)];
% V = Q0 + [t.*v(1) ; t.*v(2)];
d = pdist2(U',V'); % Pairwise distance between two sets of observations
[min_dist , position] = min2(d);
% Plot problem and result
figure
plot([P0(1) , P0(1)+u(1)] , [P0(2) , P0(1)+u(2)] , 'r-')
hold on; axis equal;
plot([Q0(1) , Q0(1)+v(1)] , [Q0(2) , Q0(2)+v(2)] , 'g-')
plot([U(1,position(1)) , V(1,position(2))] , [U(2,position(1)) V(2,position(2))] , 'b-')
title(['Minimal distance: ' num2str(min_dist) '. t=' num2str(t(position(1))) '. s = ' num2str(t(position(2)))])
legend('Vector 1' , 'Vector 2' , 'Shortest distance')
由于Matlab的
pdist2()
函数,您不需要嵌套循环。以下是一个例子:
h=0.01;
% Random vectors
P0 = [0;0];
Q0 = [0;2];
u = [1;0];
v = [0.707 ; -0.707];
t = 0:h:1; % Do not really need "s"
U = P0+t.*u;
V = Q0+t.*v;
% The lines above work in Matlab 2016b and beyond. For older versions use:
% U = P0 + [t.*u(1) ; t.*u(2)];
% V = Q0 + [t.*v(1) ; t.*v(2)];
d = pdist2(U',V'); % Pairwise distance between two sets of observations
[min_dist , position] = min2(d);
% Plot problem and result
figure
plot([P0(1) , P0(1)+u(1)] , [P0(2) , P0(1)+u(2)] , 'r-')
hold on; axis equal;
plot([Q0(1) , Q0(1)+v(1)] , [Q0(2) , Q0(2)+v(2)] , 'g-')
plot([U(1,position(1)) , V(1,position(2))] , [U(2,position(1)) V(2,position(2))] , 'b-')
title(['Minimal distance: ' num2str(min_dist) '. t=' num2str(t(position(1))) '. s = ' num2str(t(position(2)))])
legend('Vector 1' , 'Vector 2' , 'Shortest distance')
只保存最小值和位置不是更有效吗?请提供一个可运行的示例(即确保定义了所有变量),或者至少提供一些有代表性的输入和输出。另见:。你的代码怎么了?另外,是什么让您如此确信嵌套循环是这里的最佳方法(…也许可以使用矢量化来解决)?最好确保你问的是问题,而不是解决方案。另请参见:。现在提供了完整的代码,并对其进行了一些更改,这些更改似乎完成了一些技巧。仅保存最小值和位置不是更有效吗?请提供一个可运行的示例(即确保定义了所有变量),或者至少提供一些具有代表性的输入和输出。另见:。你的代码怎么了?另外,是什么让您如此确信嵌套循环是这里的最佳方法(…也许可以使用矢量化来解决)?最好确保你问的是问题,而不是解决方案。另请参阅:。现在提供了完整的代码,并对其进行了一些更改,这些更改似乎完成了一些技巧,很好的洞察力,但您的代码似乎有一些拼写错误
t
是1x101向量,u
是2x1,因此我们无法运行t.*u
。它在Matlab 2016b中工作。他们在此版本中更改了数组操作。更多信息。在旧版本中,可以使用U=P0+[t.*U(1);t.*U(2)]代码>谢谢你的回答:)效果很好,嗯,很好的洞察力,但是你的代码似乎有一些输入错误t
是1x101向量,u
是2x1,因此我们无法运行t.*u
。它在Matlab 2016b中工作。他们在此版本中更改了数组操作。更多信息。在旧版本中,可以使用U=P0+[t.*U(1);t.*U(2)]代码>谢谢你的回答:)效果很好