在 3D 空间中给定多条(N)线,找到 3D 点,最小化使用最小二乘法到所有线的距离。
How can I express this in Least Square Matrix Form? Thus, Having:
[A] - Variables matrix ( known )
[x] - Unknown vector
[b] - dependent variables vector
Ax=b => Least-Square
考虑到距离公式,A,x和' b' ?
答案 0 :(得分:2)
如果您展开上面d^2
的公式,则会发现它的格式为
d^2 = Cxx Px Px + Cxy Px Py + ... + Ex Px + Ey Py + Ez Pz + F
其中Cxx,Ex,F等是取决于A和B向量的常数。现在取每行的总和,让我们称之为P在Px,Py和Pz中的二次方和。
S = Sxx Px Px + Sxy Px Py + ... + Rx Px + Ry Py + Rz Pz + T
现在区分
dS/dx = 2 Sxx Px + Sxy Py + Sxz Pz + Rx
dS/dy = Syx Px + 2 Syy Py + Syz Pz + Ry
dS/dz = Szx Px + Szy Py + 2 Szz Pz + Rz
由于S是最小值,因此每个必须为零。你可以用矩阵形式写这个 A x = b。 [A]是Sxx等矩阵,b是向量 - [Rx,Ry,Rz],x是向量[Px,Py,Pz]。
我现在已经将2D版本实现为jsfiddle http://jsfiddle.net/SalixAlba/Y3yT9/1/ 做算法的胆量非常简单
var sxx = 0;
var sxy = 0;
var syy = 0;
var rx = 0;
var ry = 0;
var t = 0;
// each line is defined by a x + b y + c = 0
lines.forEach(function(line, index, array) {
var div = line.a * line.a + line.b * line.b;
sxx += line.a * line.a / div;
sxy += line.a * line.b / div;
syy += line.b * line.b / div;
rx += line.a * line.c / div;
ry += line.b * line.c / div;
t += line.c * line.c / div;
});
// Derivative of S wrt x and y is
// 2 sxx x + 2 sxy y + 2 rx = 0
// 2 sxy x + 2 syy y + 2 ry = 0
// Solve this pair of linear equations
var det = sxx * syy - sxy * sxy;
if(Math.abs(det) < 1e-6) {
sol = { x: -10, y: -10 };
return;
}
// (x) = 1 ( syy -sxy ) ( -rx )
// ( ) = --- ( ) ( )
// (y) det ( -sxy sxx ) ( -ry )
var x = ( - syy * rx + sxy * ry ) / det;
var y = ( sxy * rx - sxx * ry ) / det;
console.log("x "+x+" y "+y);
sol = { x: x, y: y };
return;