Matlab/Octave中X、Y、Z、V有序数据的等值面

Matlab/Octave中X、Y、Z、V有序数据的等值面,matlab,octave,geometry-surface,Matlab,Octave,Geometry Surface,我有一组3d数据点,每个数据点都有一定数量的V值。数据按有序列X Y Z V组织,其中空间坐标分布在网格上。我在每个方向上有21个点,所以几列的长度是21x21x21=9261。如何将数据转换为网格网格,以供Octave/Matlab中的isosurface使用?我的代码如下 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=re

我有一组3d数据点,每个数据点都有一定数量的V值。数据按有序列X Y Z V组织,其中空间坐标分布在网格上。我在每个方向上有21个点,所以几列的长度是21x21x21=9261。如何将数据转换为网格网格,以供Octave/Matlab中的
isosurface
使用?我的代码如下

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)。可以下载数据。

以下是一种为数据创建适当网格的方法:

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循环