所以我在看这个问题:
Matlab - Standard Deviation of Cartesian Points
这基本上回答了我的问题,除了问题是我有xyz,而不是xy。所以我不认为Ax = b会在这种情况下起作用。
我有10个笛卡尔点,我希望能够找到这些点的标准偏差。现在,我不希望每个X,Y和Z的标准偏差(由于3组),但我只想得到一个数字。
这可以使用MATLAB或excel完成。
为了更好地理解我在做什么,我有这个期望的点(1,2,3)和我记录(1.1,2.1,2.9),(1.2,1.9,3.1)等等。我希望能够找到所有记录点的可变性。
我愿意接受任何其他建议。
答案 0 :(得分:2)
如果您在链接的其他答案中执行相同操作,则应该可以正常工作。
x_vals = xyz(:,1);
y_vals = xyz(:,2);
z_vals = xyz(:,3);
然后将A
设为3列,
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
。
答案 1 :(得分:2)
随机群集数据
如果您的数据预计不在线或平面附近,只需计算每个点到质心的距离:
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线的数据
如果预计数据点大致沿着一条线的路径,并且与它有一些偏差,则可以查看到最佳拟合线的距离。首先,在您的点上安装3D线。一种方法是使用以下3D线的参数形式:
x = a*t + x0
y = b*t + y0
z = c*t + z0
生成一些带噪声的测试数据:
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))
现在你有从每个点到拟合线的距离(每个点的“误差”)。您可以计算平均值,RMS,标准差等:
>> std(errs)
ans =
0.3232
>> sqrt(mean(errs.^2))
ans =
0.7017
有关3D平面的数据
请参阅David's answer。