如何find一组笛卡尔点(xyz)的可变性或拟合/距离到三维线和/或​​平面?

所以我在看这个问题:

Matlab – Cartesian点的标准差

基本上回答我的问题,除了问题是我有xyz,而不是xy。 所以我不认为Ax = b在这种情况下会起作用。


我有10个笛卡尔点,我希望能够find这些点的标准偏差。 现在,我不想每个X,Y和Z的标准偏差(作为3组的结果),但我只想得到一个数字。

这可以使用MATLAB或Excel来完成。


为了更好地理解我在做什么,我有这个期望点(1,2,3),我logging了(1.1,2.1,2.9),(1.2,1.9,3.1)等等。 我希望能够find所有logging点的可变性。

我打开任何其他build议。

如果你做了与你链接的其他答案相同的事情,它应该工作。

x_vals = xyz(:,1); y_vals = xyz(:,2); z_vals = xyz(:,3); 

然后用3列做A

 A = [x_vals y_vals ones(size(x_vals))]; 

 b = z_vals; 

然后

 sol=A\b; m = sol(1); n = sol(2); c = sol(3); 

接着

 errs = (m*x_vals + n*y_vals + c) - z_vals; 

之后,你可以使用errs ,就像在链接的问题。

随机聚集数据

如果您的数据预计不在线或平面附近,只需计算每个点与质心的距离即可:

 xyz_bar = mean(xyz); M = bsxfun(@minus,xyz,xyz_bar); d = sqrt(sum(M.^2,2)); % distances to centroid 

那么你可以计算任何你喜欢的变化。 例如,标准偏差和RMS误差:

 std(d) sqrt(mean(d.^2)) 

关于3D线的数据

如果数据点预计大致沿着一条线的path,并有一些偏差,你可以看看最适合线的距离。 首先,将一条3D线放到你的要点上。 一种方法是使用以下三维线的参数化forms:

 x = a*t + x0 y = b*t + y0 z = c*t + z0 

用噪音生成一些testing数据:

 abc = [2 3 1]; xyz0 = [6 12 3]; t = 0:0.1:10; xyz = bsxfun(@plus,bsxfun(@times,abc,t.'),xyz0) + 0.5*randn(numel(t),3) plot3(xyz(:,1),xyz(:,2),xyz(:,3),'*') % to visualize 

估算3D线参数:

 xyz_bar = mean(xyz) % centroid is on the line M = bsxfun(@minus,xyz,xyz_bar); % remove mean [~,S,V] = svd(M,0) abc_est = V(:,1).' abc/norm(abc) % compare actual slope coefficients 

从点到3D线的距离:

 pointCentroidSeg = bsxfun(@minus,xyz_bar,xyz); pointCross = cross(pointCentroidSeg, repmat(abc_est,size(xyz,1),1)); errs = sqrt(sum(pointCross.^2,2)) 

现在你有从每个点到适合线的距离(每个点的“错误”)。 你可以计算均值,均方根,标准偏差等。

 >> std(errs) ans = 0.3232 >> sqrt(mean(errs.^2)) ans = 0.7017 

有关3D平面的数据

见大卫的回答 。