3

特定の量の値 V が関連付けられている 3 次元データ ポイントのセットがあります。データは順序付けられた列 XYZV に編成され、空間座標がグリッド上に分散されます。すべての方向に 21 個のポイントがあるため、いくつかの列の長さは 21x21x21=9261 です。isosurfaceOctave/Matlabで使用できるメッシュグリッドにデータを変換するにはどうすればよいですか? 私のコードは次のとおりです

a=load("data.txt");
X=reshape(a(:,1), 21,21,21);
Y=reshape(a(:,2), 21,21,21);
Z=reshape(a(:,3), 21,21,21);
V=reshape(a(:,2), 21,21,21);
fv=isosurface (X,Y,Z,V,0.9);
patch(fv)

しかし、結果は意味がありません (x=0.9 と 1 にある 2 つの平面を取得します)。データはこちらからダウンロードできます。

4

1 に答える 1

2

データの適切なメッシュグリッドを作成する方法は次のとおりです。

a = load('data.txt');
[X, Y, Z] = meshgrid(unique(a(:, 1)), unique(a(:, 2)), unique(a(:, 3)));
V = zeros(21, 21, 21);
for i = 1:numel(V)
  idx = find(a(:, 1) == X(i) & a(:, 2) == Y(i) & a(:, 3) == Z(i));
  V(i) = a(idx, 4);
end
fv = isosurface (X,Y,Z,V,0.9);
p = patch(fv);
set(p,'FaceColor','red','EdgeColor','none');
camlight;
lighting gouraud;
xlabel('x');
ylabel('y');
zlabel('z');

ここに画像の説明を入力

はるかに大きなデータがあり、これが遅すぎる場合は、元のデータを再形成して、上記で使用した for ループを回避する方法を思い付くことができます。

于 2013-01-08T19:30:13.780 に答える