如何从Matlab中的数据分散创建3D平面

时间:2016-09-27 22:17:43

标签: matlab 3d average data-analysis plane

目标 - 根据Matlab中的XYZ数据散布

创建平面曲面

说明 寻找从大型数据集创建平面的方法 数据集是扫描表面不完全平坦的测量数据,并且不会平坦到任何平面,因此难以进行统计分析。

目标是找到最能代表大部分点的平面,然后将其与XY平面对齐,以便从中提取信息。

附加的图像是数据图。颜色表示高度。注意:忽略小蓝点,这是我不用担心的其他数据。

数据的结构如何:

数据以N X 3数组形式出现

  • X是第一列
  • Y是第二栏
  • Z是第三栏

平面几乎是平坦的,但我需要将“平均平面”与XY平面精确对齐,以便考虑其他数据,这些数据可能与此示例不同。

在找到“平均平面”后,我会通过找到平面与XY,XZ和YZ轴的角度来进行矩阵变换以使其与轴对齐

我不寻找的东西,我也在搜索中找到:从3点找到一架飞机,或者使用冲浪或者delauny从数据中找到“滚动”表面图。

Example of plotted surface data - Image

2 个答案:

答案 0 :(得分:1)

您是否尝试过fit

ft = fit([X, Y], Z,'poly11');
UnnormPlaneNorm = [ft.p10; ft.p01; -1];
planeNorm = UnnormPlaneNorm / norm(UnnormPlaneNorm);
angleXY = acos([0,0,1] * planeNorm);
angleXZ = acos([0,1,0] * planeNorm);
angleYZ = acos([1,0,0] * planeNorm);

答案 1 :(得分:0)

4个步骤:

%1。计算数据的中心

%2。从数据中减去中心

%3。将2D平面安装到居中数据

%4。将计算中心添加回

首先,我将生成一组位于平面中的随机数据:

clear;close all;clc;

% Create a random set of data 
mag = 20;
N   = 1000;
A   = 2 * mag * ( rand( N, 3 ) - 0.5 );

% We want to make sure that the data lies in a plane, so let's reduce it
% with the svd
[ U, S, V ] = svd(A,'econ');
S(3,3)      = 0;
A           = U * S * V.';

% Now we are going to offset the plane from the origin by a random point 
p   = 100 * rand(1,3); 
A   = A + repmat( p, N, 1 );

% Make sure we have the dataset we want by viewing from different angles
figure 
subplot(1,3,1)
plot3(A(:,1),A(:,2),A(:,3),'.')
hold on
grid minor
view([1,1,1])
subplot(1,3,2)
plot3(A(:,1),A(:,2),A(:,3),'.')
hold on
grid minor
view([1,-1,1])
subplot(1,3,3)
plot3(A(:,1),A(:,2),A(:,3),'.')
hold on
grid minor
view([-1,1,1])

enter image description here 现在,在这一点上,A中的数据完全位于一个平面中。但我们想要噪声数据以确保算法正常工作。所以让我们重新加入噪音:

% Now let's add some noise to our data 
B   = A + randn(size(A));

现在我们开始在飞机上安装数据......

% 1. Compute the center of the data 
c   = mean(B);

% 2. Subtract off the mean from the data 
D   = B - repmat( c, N, 1 );

% 3. Fit a 2D plane to the centered data 
[ U, S, V ] = svd( D, 'econ' );
S(3,3)      = 0;
D           = U * S * V.';

% 4. Offset by the computed center
D   = D + repmat( c, N, 1 );

% 5. Visualize by comparing with the noisy data
figure
subplot(1,3,1)
plot3(B(:,1),B(:,2),B(:,3),'.')
hold on
plot3(D(:,1),D(:,2),D(:,3),'.')
grid minor
view([1,1,1])
subplot(1,3,2)
plot3(B(:,1),B(:,2),B(:,3),'.')
hold on
plot3(D(:,1),D(:,2),D(:,3),'.')
grid minor
view([1,-1,1])
subplot(1,3,3)
plot3(B(:,1),B(:,2),B(:,3),'.')
hold on
plot3(D(:,1),D(:,2),D(:,3),'.')
grid minor
view([-1,1,1])

enter image description here