1. 跪求matlab 凸包演算法 算多邊形面積
Matlab演算法
x和y代表你畫的散點的橫縱坐標向量,當然肯定是等長度的。
plot(x,y, '*', 'markersize',10);
dt = DelaunayTri(x,y);
k = convexHull(dt);
plot(x,y, '.', 'markersize',10);
hold on;
plot(x(k), y(k), 'r');
Perimeter = sqrt(diff(x(k))*diff(x(k))'+ diff(y(k))*diff(y(k))'); % 周長
area=abs(trapz(x(k),y(k)))%面積
就是先把散點的區域用凸多邊形畫出來,然後再求多邊形的面積和周長。
2. 已知點集的matlab 三維凸包 用公式表達出來
用 qhull 計算三維點集的凸包
在計算幾何領域,qhull 是個很強大的程序,它可以計算 2 維、3 維,以及4 維以上維度點集的凸包、Delaunay 網格、Voronoi 圖,並且 Matlab 和 Octave 都基於它來提供計算幾何功能,Mathematica 使用它實現 Delaunay 網格構造。不過,也正是因為它過於強大,所以我在它的源代碼中逡巡了好久,也沒有看懂。現在我能做到的,就是找個梯子先爬上這個黑箱子。
因為 qhull 是一個復雜的命令行工具箱,用戶可以通過各種命令選項去調用適當的程序。比如,要對點集進行 Delaunay 網格化,可以直接使用 "qdelaunay" 命令來實現,也可以通過 "qhull d Qbb" 命令來實現。
在 qhull 工具箱中,要構建點集的凸包,可以調用 "qconvex" 命令來實現,而且 "qhull" 如果在未設定命令選項時,默認調用的程序就是 qconvex。對於我要解決的問題,即使用 qhull 構造三維點集的凸包而言,基本命令格式如下:
$ qconvex [選項] < input_file > output_file
qconvex 程序的行為由一組功能選項來控制,常用的如下:
Qt - 三角化輸出,也就是輸出由三角面片組合而成的凸包數據
QJ - 對於近似於平面的數據進行一些簡化,譬如對於三維點集,
- 可以保證不會出現 4 點共面的情況
Tv - 從結構、凸性以及數據包含等方面對凸包構建結果進行校驗
- - 輸出 qconvex 所有選項信息
對於凸包構建結果的輸出,qconvex 提供了一組輸出控制選項,常用的如下:
s - 輸出凸包構建結果概要 (default)
i - 輸出凸包上每個面片的頂點
n - 輸出凸包上每個面的方程系數
p - 輸出要進行凸包求解的點集的坐標
Fx - 輸出極點(凸包頂點)
FA - 輸出凸包的面積和體積
o - 採用 OFF 格式輸出凸包構建結果(維度, 頂點數, 面數, 邊數)
G - 採用 Geomview 格式輸出凸包構建結果(只支持 2 維至 4 維)
m - 採用 Mathematica 格式輸出凸包構建結果(只支持 2 維與 3 維)
TO 文件名 - 將凸包構建結果輸出到文件
我們來玩真格的。首先准備好一份存放三維數據點信息的文本文件,文件的第一行是點數,其餘每行都是一個數據點的 x, y, z 坐標信息。對於下圖所示的 venus 點雲,其數據文件 venus.asc 格式為:
26218
3.554705 199.173300 8.394049
3.584999 199.553600 10.168500
3.648500 200.610500 9.662390
3.667395 198.429900 10.576820
3.740701 198.771200 12.616080
3.796498 200.566700 7.518420
3.798301 197.899800 9.092709
3.814104 197.907700 12.370720
3.839600 200.038700 12.814610
... ... ... ... ... ...
現在使用 qconvex 對 venus.asc 文件所包含的點集構建凸包,採用 OFF (Object File Format) 格式輸出:
$ qconvex o < venus.asc TO result.off
qconvex 輸出的 off 格式文件自上而下由三部分構成:
文件頭信息,即文件的第一行是數據的維度,第二行的內容是凸包頂點數、面片數和邊數;
點表,存放凸包頂點的坐標信息;
面表,按逆時針次序記錄面片頂點在點表中的序號(從 0 開始)。
在 off 文件的面表區域,第一列數字用來表示每個面片所含的頂點的個數。
在 linux 下,可以使用 geomview 來顯示 OFF 格式文件,但前提是將 qconvex 輸出的 off 文件的第一行內容替換為 "OFF"。下面是一份 geomview 所能接受的 OFF 文件格式,顯示結果如下圖所示。
# 文件頭 (本行文本是注釋,實際中應當去掉)
OFF
26218 4870 7305
# 點表 (本行文本是注釋,實際中應當去掉)
3.584999 199.5536 10.1685
3.740701 198.7712 12.61608
3.796498 200.5667 7.51842
... ... ... ... ... ...
# 面表 (本行文本是注釋,實際中應當去掉)
3 9864 9563 9674
3 9563 9864 9833
3 6318 1422 452
3. MATLAB 如何找到 一組給定的離散的點 的 外圍凸多邊形,並且輸出此多邊形頂點坐標
先用DelaunayTri得到三角剖分,然後使用convexhull得到凸包。例子:
x=rand(100,1)
y=rand(100,1)
dt=DelaunayTri(x,y);
k=convexHull(dt);
plot(x,y,'.','markersize',10);holdon;
plot(x(k),y(k),'r');holdoff;
4. MATLAB 一堆散點如何求包絡線
你可以用convexHull來找出凸包。
%%x,y弄成列向量
dt=DelaunayTri(x,y)
k=convexHull(dt)
plot(x,y,'.','markersize',10);holdon;
plot(x(k),y(k),'r');holdoff;
5. matlab 裡面如何用紅色十字標記凸包節點
如果沒記錯你可以是這么寫試試:plot(x(s),y(s),'r+')
6. matlab 常用命令有哪些
matlab命令
一、常用對象操作:除了一般windows窗口的常用功能鍵外。
1、!dir 可以查看當前工作目錄的文件。 !dir& 可以在dos狀態下查看。
2、who 可以查看當前工作空間變數名, whos 可以查看變數名細節。
3、功能鍵:
功能鍵 快捷鍵 說明
方向上鍵 Ctrl+P 返回前一行輸入
方向下鍵 Ctrl+N 返回下一行輸入
方向左鍵 Ctrl+B 游標向後移一個字元
方向右鍵 Ctrl+F 游標向前移一個字元
Ctrl+方向右鍵 Ctrl+R 游標向右移一個字元
Ctrl+方向左鍵 Ctrl+L 游標向左移一個字元
home Ctrl+A 游標移到行首
End Ctrl+E 游標移到行尾
Esc Ctrl+U 清除一行
Del Ctrl+D 清除游標所在的字元
Backspace Ctrl+H 刪除游標前一個字元
Ctrl+K 刪除到行尾
Ctrl+C 中斷正在執行的命令
4、clc可以命令窗口顯示的內容,但並不清除工作空間。
二、函數及運算
1、運算符:
+:加, -:減, *:乘, /: 除, \:左除 ^: 冪,『:復數的共軛轉置, ():制定運算順序。
2、常用函數表:
sin( ) 正弦(變數為弧度)
Cot( ) 餘切(變數為弧度)
sind( ) 正弦(變數為度數)
Cotd( ) 餘切(變數為度數)
asin( ) 反正弦(返回弧度)
acot( ) 反餘切(返回弧度)
Asind( ) 反正弦(返回度數)
acotd( ) 反餘切(返回度數)
cos( ) 餘弦(變數為弧度)
exp( ) 指數
cosd( ) 餘弦(變數為度數)
log( ) 對數
acos( ) 余正弦(返回弧度)
log10( ) 以10為底對數
acosd( ) 余正弦(返回度數)
sqrt( ) 開方
tan( ) 正切(變數為弧度)
realsqrt( ) 返回非負根
tand( ) 正切(變數為度數)
abs( ) 取絕對值
atan( ) 反正切(返回弧度)
angle( ) 返回復數的相位角
atand( ) 反正切(返回度數)
mod(x,y) 返回x/y的余數
sum( ) 向量元素求和
3、其餘函數可以用help elfun和help specfun命令獲得。
4、常用常數的值:
pi 3.1415926…….
realmin 最小浮點數,2^-1022
i 虛數單位
realmax 最大浮點數,(2-eps)2^1022
j 虛數單位
Inf 無限值
eps 浮點相對經度=2^-52
NaN 空值
三、數組和矩陣:
1、構造數組的方法:增量發和linspace(first,last,num)first和last為起始和終止數,num為需要的數組元素個數。
2、構造矩陣的方法:可以直接用[ ]來輸入數組,也可以用以下提供的函數來生成矩陣。
ones( ) 創建一個所有元素都為1的矩陣,其中可以制定維數,1,2….個變數
zeros() 創建一個所有元素都為0的矩陣
eye() 創建對角元素為1,其他元素為0的矩陣
diag() 根據向量創建對角矩陣,即以向量的元素為對角元素
magic() 創建魔方矩陣
rand() 創建隨機矩陣,服從均勻分布
randn() 創建隨機矩陣,服從正態分布
randperm() 創建隨機行向量
horcat C=[A,B],水平聚合矩陣,還可以用cat(1,A,B)
vercat C=[A;B],垂直聚合矩陣, 還可以用cat(2,A,B)
repmat(M,v,h) 將矩陣M在垂直方向上聚合v次,在水平方向上聚合h次
blkdiag(A,B) 以A,和B為塊創建塊對角矩陣
length 返回矩陣最長維的的長度
ndims 返回維數
numel 返回矩陣元素個數
size 返回每一維的長度,[rows,cols]=size(A)
reshape 重塑矩陣,reshape(A,2,6),將A變為2×6的矩陣,按列排列。
rot90 旋轉矩陣90度,逆時針方向
fliplr 沿垂軸翻轉矩陣
flipud 沿水平軸翻轉矩陣
transpose 沿主對角線翻轉矩陣
ctranspose 轉置矩陣,也可用A』或A.』,這僅當矩陣為復數矩陣時才有區別
inv 矩陣的逆
det 矩陣的行列式值
trace 矩陣對角元素的和
norm 矩陣或矢量的范數,norm(a,1),norm(a,Inf)…….
normest 估計矩陣的最大范數矢量
chol 矩陣的cholesky分解
cholinc 不完全cholesky分解
lu LU分解
luinc 不完全LU分解
qr 正交分解
kron(A,B) A為m×n,B為p×q,則生成mp×nq的矩陣,A的每一個元素都會乘上B,並占據p×q大小的空間
rank 求出矩陣的刺
pinv 求偽逆矩陣
A^p 對A進行操作
A.^P 對A中的每一個元素進行操作
四、數值計算
1、線性方程組求解
(1)AX=B的解可以用X=A\B求。XA=B的解可以用X= A/B求。如果A是m×n的矩陣,當m=n時可以找到唯一解,m<n,不定解,解中至多有m個非零元素。如果m>n,超定系統,至少找到一組解。如果A是奇異的,且AX=B有解,可以用X=pinv(A)×B返回最小二乘解
(2)AX=b, A=L×U,[L,U]=lu(A), X=U\(L\b),即用LU分解求解。
(3)QR(正交)分解是將一矩陣表示為一正交矩陣和一上三角矩陣之積,A=Q×R[Q,R]=chol(A), X=Q\(U\b)
(4)cholesky分解類似。
2、特徵值
D=eig(A)返回A的所有特徵值組成的矩陣。[V,D]=eig(A),還返回特徵向量矩陣。
3、A=U×S×UT,[U,S]=schur(A).其中S的對角線元素為A的特徵值。
4、多項式Matlab裡面的多項式是以向量來表示的,其具體操作函數如下:
conv 多項式的乘法
deconv 多項式的除法,【a,b】=deconv(s),返回商和余數
poly 求多項式的系數(由已知根求多項式的系數)
polyeig 求多項式的特徵值
Polyfit(x,y,n) 多項式的曲線擬合,x,y為被擬合的向量,n為擬合多項式階數。
polyder 求多項式的一階導數,polyder(a,b)返回ab的導數
[a,b]=polyder(a,b)返回a/b的導數。
polyint 多項式的積分
polyval 求多項式的值
polyvalm 以矩陣為變數求多項式的值
resie 部分分式展開式
roots 求多項式的根(返回所有根組成的向量)
註:用ploy(A)求出矩陣的特徵多項式,然後再求其根,即為矩陣的特徵值。
5、插值常用的插值函數如下:
griddata 數據網格化合曲面擬合
Griddata3 三維數據網格化合超曲面擬合
interp1 一維插值(yi=interp1(x,y,xi,』method』)Method=nearest/linear/spline/pchip/cubic
Interp2 二維插值zi=interp1(x,y,z,xi,yi』method』),bilinear
Interp3 三維插值
interpft 用快速傅立葉變換進行一維插值,help fft。
mkpp 使用分段多項式
spline 三次樣條插值
pchip 分段hermit插值
6、函數最值的求解
fminbnd(『f』,x1,x2,optiset(,))求f在 x1和x2之間的最小值。Optiset選項可以有『Display』+『iter』/』off』/』final』,分別表示顯示計算過程/不顯示/只顯示最後結果。fminsearch求多元函數的最小值。fzero(『f』,x1)求一元函數的零點。X1為起始點。同樣可以用上面的選項。
五、圖像繪制:
1、基本繪圖函數
plot 繪制二維線性圖形和兩個坐標軸
plot3 繪制三維線性圖形和兩個坐標軸
fplot 在制定區間繪制某函數的圖像。fplot(『f』,區域,線型,顏色)
loglog 繪制對數圖形及兩個坐標軸(兩個坐標都為對數坐標)semilogx 繪制半對數坐標圖形
semilogy 繪制半對數坐標圖形
2、線型: 顏色 線型
y 黃色 . 圓點線 v 向下箭頭
g 綠色 -. 組合 > 向右箭頭
b 藍色 + 點為加號形 < 向左箭頭
m 紅紫色 o 空心圓形 p 五角星形
c 藍紫色 * 星號 h 六角星形
w 白色 . 實心小點 hold on 添加圖形
r 紅色 x 叉號形狀 grid on 添加網格
k 黑色 s 方形 - 實線
d 菱形 -- 虛線 ^ 向上箭頭
3、可以用subplot(3,3,1)表示將繪圖區域分為三行三列,目前使用第一區域。此時如要畫不同的圖形在一個窗口裡,需要hold on。
7. matlab如何求大量數據中分布最多的范圍及中心點。
樓主是不是想求出一個最小半徑的圓,圓內包含所有的點?這個問題很有趣。
尋找這個圓的時候注意一下幾點:
1.這個圓必然穿過圖中某些靠外圍的點,這樣才是最小半徑的圓。
2.幾何中我們知道,三個點可以確定一個圓, 我們就是需要找出這三個點來.
演算法如下:1.先求這些點對應的凸包,已經有現成的演算法。
2.生成凸包後,在看凸包上哪三點確定的圓可以包含凸包。
當然如果樓主討論的不是以上所述,而是模式分類的話,建議看看數據分類方法。可以搜索關鍵字:Gaussian mixtrual model, expectation-maximization algorithm 和 k-mean algorithm 學習下相關的知識。
8. matlab中convhull函數怎麼用
matlab中的convhull()函數是凸包函數,用於計算給定區域的面積或體積。convhull使用格式:
一、凸包面積
k = convhull(x,y) %計算凸包的面積
例如:
P = [0 0; 1 1; 1.5 0.5; 1.5 -0.5; 1.25 0.3; 1 0; 1.25 -0.3; 1 -1];
[k,av] = convhull(P); %av=1.75
plot(P(:,1),P(:,2),'*') %繪制原始點及凸包。
hold on
plot(P(k,1),P(k,2))
二、凸包體積
k = convhull(x,y,z) %計算凸包的體積
例如:
[x,y,z] = meshgrid(-2:1:2,-2:1:2,-2:1:2);
x = x(:);y = y(:);z = z(:);
[k,av] = convhull(x,y,z);av %av=64
trisurf(k,x,y,z,'FaceColor','cyan'),axis equal