问题:创建需要六个输入的函数mylinecheck(a,b,c,d,e,f)
:
a,b,c,d,e,f
是实数,a,c,e
不相等。该函数必须检查三个点(a,b)
,(c,d)
和(e,f)
是否都位于同一行。如果是,则返回1.如果不是,则返回0。
我认为我想要做的是告诉MATLAB检查坐标(c,d)
和(e,f)
是(a,b)
的倍数,然后如果不是,我将返回0.如果是,我将返回1.如果这是正确的思考过程,我不确定如何命令MATLAB这样做。任何建议都将不胜感激。
答案 0 :(得分:3)
点(x1,y1)
,(x2,y2)
和(x3,y3)
位于同一行,当且仅当它们满足时
a x + b y + c = 0
对于a
,b
和c
的固定值(我无法克服你的记法;抱歉“混淆”),a
或{{ 1}}非零。因此,当且仅当
b
即具有矩阵的均匀线性系统
a x1 + b y1 + c = 0 [x1 y1 1][a] [0]
a x2 + b y2 + c = 0 <=> [x2 y2 1][b] = [0]
a x3 + b y3 + c = 0 [x3 y3 1][c] [0],
有一个非零解决方案。仅当 [x1 y1 1]
X = [x2 y2 1]
[x3 y3 1]
是单数时才可以这样做。通过删除X
的最后一列,您可以发现当{且仅当矩阵
X
是单数的
X
是单数。
为了在Matlab中可靠地检查矩阵的奇异性,您可以使用SVD或等效函数Y = [x2-x1 y2-y1]
[x3-x1 y3-y1]
。因此,您的功能可以实现如下:
rank
答案 1 :(得分:2)
如果你想检查所有点是否都在同一行(或collinear),那么经典方法之一就是假设每个点在三角形中形成一个顶点。如果三个点使得三角形使得该面积等于0,则这些点将共线或形成线。这可以通过检查以下矩阵的行列式来完成:
[a b 1]
[c d 1]
[e f 1]
你可以在这里阅读关于Wolfram Mathworld的共线性的文章:http://mathworld.wolfram.com/Collinear.html(我也在上面链接了它)。
因此,您的功能只需要:
function [out] = mylinecheck(a,b,c,d,e,f)
D = [a b 1; c d 1; e f 1];
out = det(D) == 0;
然而,由于数值不精确,您可以提供浮点数,其中点确实是共线的,但是您可能得到一个不等于0的行列式(实际上,可能是一个小数字)。因此,我可以建议的一件事是检查行列式是否小于一个小数。类似的东西:
function [out] = mylinecheck(a,b,c,d,e,f)
D = [a b 1; c d 1; e f 1];
out = abs(det(D)) < 1e-10;
1e-10
是一个小数字10^{-10}
。我们将abs
考虑到正面和负面的决定因素,因此您将检查共线性,如果符合以下情况则为真:
-10^{-10} < det(D) < 10^{-10}
然而,根据Pavel的评论,如果点落在同一条线上,如果我们决定缩放坐标,则行列式值也会增加。我的一个建议是,可能会更加自由的门槛。把它做大......也许像0.1
。