1. 程式人生 > >利用matlab將三維資料畫成三維立體圖

利用matlab將三維資料畫成三維立體圖

首先先分析物件。將資料利用matlab畫出圖,最開始是匯入資料,然後處理資料,最後將處理的資料畫出來。

所以我將它分為三個步驟。

第一步:匯入資料

  • 如果是mat資料。可以直接load
  • 如果是txt資料。可以用txtread
  • 如果是excel資料。可以用xlsread

詳細的,可以參考https://blog.csdn.net/blueskyjian/article/details/72832449

程式碼如下:

%% 匯入資料
clear all;clc;close all;
load xyzdata.mat;%匯入的的資料應當去除NaN值

這是我的資料截圖:

注:需要注意的是,要將資料的NaN(空值)去掉。可以在matlab工作去檢視,並去除。

第二步:資料處理

由於我們的x、y軸資料,並不是1 、 2 、3等這樣的整數排列的,所以必須利用原有的資料,重新構造三維資料。

重構三維資料主要有兩步:

  • 第一步:柵格化,用到meshgrid()函式
  • 第二步:插值,用到griddata()函式

柵格化原理、效果可以參考https://blog.csdn.net/shanchuan2012/article/details/72772191

簡單來時就是繪製網格

插值原理、效果可以參考https://blog.csdn.net/pingmin2014/article/details/47298947

簡單來說就是估計繪製網格格點的z的資料

程式碼如下:

%% 相關計算
[a,~]=size(xRow);%x軸資料總共*******行;
xmax=max(xRow);%x軸資料最大值為********
xmin=min(xRow);%x軸資料最小值為*********
%下面兩行是測試用的,便於設定間隔值
%delta_x=xmax-xmin;%x軸範圍寬度值為*****
%delta_x/a;%z軸間隔大約為1.4796e-04,可以設定為0.01,如果想要更為精確,可以設定為0.001、0.0001
[b,~]=size(yCol);%y軸資料為********
ymax=max(yCol);%y軸資料最大值為********
ymin=min(yCol);%y軸資料最小值為********
%下面兩行是測試用的,便於設定間隔值
%delta_y=ymax-ymin;%軸範圍寬度值為為*********
%delta_y/b;%y軸間隔大約為9.9876e-05,可以設定為0.01,如果想要根為精確,可以設定為0.001、0.0001

第三步:畫圖

這一步需要注意的是:選好網格間隔,網格間隔越小,精確度越高,相對應的,計算量越大,電腦效能要求越高。

電腦效能不高的,可以跳大間隔,同時優化程式碼,清除畫圖用不了的變數。

程式碼如下:

%% 重構三維資料,畫圖
%間隔為 0.05的時候,X Y資料為 *****×****,  電腦一般的,將間隔調大
%間隔為    1的時候,X Y資料為 ***×****,    電腦  好的,將間隔調小
[X,Y]=meshgrid(xmin:1:xmax,ymin:1:ymax);%將x、y軸網格化,重構用於畫圖x、y軸資料
Z=griddata(xRow,yCol,z,X,Y);%插值,重構用於畫圖的Z軸資料
clear a b xmax xmin ymin ymax xRow yCol z;
mesh(X,Y,Z)

實驗結果:

由於保密需要嗎,影象結果打上馬賽克,資料也不能提供。

完整程式碼:

%利用txt excel等大量x y z資料,化三維立體圖
%% 匯入資料
clear all;clc;close all;
load xyzdata.mat;%匯入的的資料應當去除NaN值
%% 相關計算
[a,~]=size(xRow);%x軸資料總共********行;
xmax=max(xRow);%x軸資料最大值為**********
xmin=min(xRow);%x軸資料最小值為********
%下面兩行是測試用的,便於設定間隔值
%delta_x=xmax-xmin;%x軸範圍寬度值為*****
%delta_x/a;%z軸間隔大約為1.4796e-04,可以設定為0.01,如果想要更為精確,可以設定為0.001、0.0001
[b,~]=size(yCol);%y軸資料為******
ymax=max(yCol);%y軸資料最大值為******
ymin=min(yCol);%y軸資料最小值為********
%下面兩行是測試用的,便於設定間隔值
%delta_y=ymax-ymin;%軸範圍寬度值為為******
%delta_y/b;%y軸間隔大約為9.9876e-05,可以設定為0.01,如果想要根為精確,可以設定為0.001、0.0001
%% 重構三維資料,畫圖
%間隔為 0.05的時候,X Y資料為 *****×****,  電腦一般的,將間隔調大
%間隔為    1的時候,X Y資料為 ***×***,    電腦  好的,將間隔調小
[X,Y]=meshgrid(xmin:1:xmax,ymin:1:ymax);%將x、y軸網格化,重構用於畫圖x、y軸資料
Z=griddata(xRow,yCol,z,X,Y);%插值,重構用於畫圖的Z軸資料
clear a b xmax xmin ymin ymax xRow yCol z;
mesh(X,Y,Z)

給學matlab的人,包括我自己一個勉勵:路漫漫其修遠兮,吾將上下而求索。