首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab/Octave中X,Y,Z,V有序数据的等值曲面

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

Stack Overflow用户
提问于 2013-01-09 01:28:08
回答 1查看 2.8K关注 0票数 3

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

代码语言:javascript
复制
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的平面)。数据可以从here下载。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-09 03:30:14

这里有一种方法可以创建一个合适的数据网格:

代码语言:javascript
复制
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循环。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14220713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档