2009-11-11 57 views
1

我有三個相同長度的數組,在Matlab中有X,YZX(i),Y(i)Z(i)形成一對3D座標。生成方形網格,給定無序的X,Y和Z矢量

現在的問題是,如何利用這三個陣列生成正方形網孔,如下圖所示: alt text http://www.mathworks.com/access/helpdesk/help/techdoc/ref/graphics_m3.gif

我從mesh plot Matlab的文件中得到了圖像。所以顯然mesh命令不是我想要的,因爲它在Matlab程序中繪製了網格本身,而我需要網格元素(以及座標),以便我可以在其他程序(如C#)中繪製出它們自己。

換句話說,我在尋找數學算法來生成網格,允許mesh命令繪製下面的圖形。

編輯:我意識到我的問題在一個良好的睡眠後不清楚。所以這裏有更多的細節。我通過使用此命令[x,y]=meshgrid[rangex, rangy]生成了xy矢量,然後使用函數z(x,y)定義了矢量z。我將不得不返回一個方形元素列表(如下圖所示)以及相應的x,y座標。所以基本上我只想用這些數據重新繪製下面的圖。

有什麼建議嗎?

+1

請進一步澄清問題。看着不同的答案,我不認爲我們任何人都明白你想要什麼。 – MatlabDoug 2009-11-11 18:09:55

+0

下面是一些額外的信息,您應該添加到問題中以幫助我們幫助您:數組的大小'X,Y,Z',可能存在的某些示例值,以及您對「元素」和「點」(我認爲你指的是網格中每個正方形的元素,並且你指的是一組索引到一個點數組中,這將給你的方形角的座標)。 – gnovice 2009-11-11 21:44:15

回答

0
x = [1 2 3]; 
    y = [11 22 33]'; 
    [X, Y] = meshgrid(x,y) 
X = 

    1  2  3 
    1  2  3 
    1  2  3 


Y = 

    11 11 11 
    22 22 22 
    33 33 33 
+0

好主意,但meshgrid不給我一個元素及其相應點的列表。 – Graviton 2009-11-11 14:53:36

2

你基本上什麼是3個矩陣:

% define x_range and y_range as you wish 
[x, y] - meshgrid(x_range,y_range) 

z = some_function_of_x_and_y 

現在你有這三個矩陣重塑入行向量:

sizes = size(x) 
x_row = reshape(x, sizes(1) * sizes(2), 1) 
y_row = reshape(y, sizes(1) * sizes(2), 1) 
z_row = reshape(z, sizes(1) * sizes(2), 1) 

和指數的另一個問題:

indeces = [1:length(x_row)]' 

現在您的清單是:

result = [indeces x_row y_row z_row] 

例如:

x_range = [1,2,3]; 
y_range = [1,2,3]; 

>> [x,y] = meshgrid(x_range, y_range) 

x = 

    1  2  3 
    1  2  3 
    1  2  3 


y = 

    1  1  1 
    2  2  2 
    3  3  3 

>> z = x+y 

z = 

    2  3  4 
    3  4  5 
    4  5  6 

>> x_row = reshape(x, sizes(1) * sizes(2), 1); 
>> y_row = reshape(y, sizes(1) * sizes(2), 1); 
>> z_row = reshape(z, sizes(1) * sizes(2), 1); 

>> indeces = [1:length(x_row)]'; 

>> result = [indeces x_row y_row z_row] 

result = 

    1  1  1  2 
    2  1  2  3 
    3  1  3  4 
    4  2  1  3 
    5  2  2  4 
    6  2  3  5 
    7  3  1  4 
    8  3  2  5 
    9  3  3  6 

現在result保持在第一列的indeces,並在列的其餘(x,y,z)。你應該能夠從那裏提取你想要的東西。

+0

您的代碼無法編譯,重塑功能無法運行。 – Graviton 2009-11-11 15:20:56

+0

你是對的......修好了! – 2009-11-11 18:11:52

0

這裏有兩種可能性。如果這些點實際上已經在(x,y)平面上形成了一個規則的格子,並且你需要做的就是解開哪些點到哪裏,那麼排序就可以解決你的問題。具體來說,在(x,y)對上使用sortrows,然後應用於z的重塑將使數組進入適當的形狀。東西大致是這樣的...

[xy,tags] = sortrows([x(:),y(:)]); 
z = reshape(z(tags),[n,m]); 

但是,如果你的數據是分散的,那麼你需要使用插值或表面擬合。 GRIDDATA將解決插值問題,但它只會插值到數據的邊界。

GRIDFIT,一個在文件交換中找到的工具,將解決將實質上低階樣條曲面擬合到您的數據的問題。

+0

不確定您的示例是否有效;我不知道如何通過重塑「z」來生成元素列表。 – Graviton 2009-11-11 15:45:27

相關問題