在Matlab中:从体积';提纲

在Matlab中:从体积';提纲,matlab,grid,binary-matrix,Matlab,Grid,Binary Matrix,我一直在努力寻找下面描述的问题的好解决方案。我想避免for循环,但觉得我的Matlab技能不足以胜任其他工作。我有一个329x230x105大小的3D位置矩阵。这定义了10000x7000x3100米的三维体积。除子体积外,大多数matix元素为零: 我需要构造一个与我的原始矩阵大小相同的掩模,该掩模被划分为大型子图,每个子图定义一个1000x1000x1000米的规则子体积,并将1分配给子矩阵中的所有元素,该子矩阵至少包含我的原始矩阵中的一个on元素(非零)。在XY中查看: 因此,最终结果

我一直在努力寻找下面描述的问题的好解决方案。我想避免for循环,但觉得我的Matlab技能不足以胜任其他工作。我有一个329x230x105大小的3D位置矩阵。这定义了10000x7000x3100米的三维体积。除子体积外,大多数matix元素为零:

我需要构造一个与我的原始矩阵大小相同的掩模,该掩模被划分为大型子图,每个子图定义一个1000x1000x1000米的规则子体积,并将1分配给子矩阵中的所有元素,该子矩阵至少包含我的原始矩阵中的一个on元素(非零)。在XY中查看:

因此,最终结果是一个3D遮罩(下图为XY),其中标记单元格(红色)内的所有元素的值均为1,外部元素的值均设置为0:

请注意,我对体积边界框或凸包顶点不感兴趣

非常感谢

添加信息,回答@grantnz:

好吧,我还不确定以下代码是否在所有情况下都能工作,但以下是我所做的(在我的笔记本电脑上几乎需要10秒钟):


我提出了以下解决方案:

clear all
clc

x=1:336;
y=1:240;
z=1:120;

[meshy, meshx, meshz] = meshgrid(y, x, z);

% myspace is just your volumentric dataset as a logical matrix
s1 = [168 120 60];
myspace = sqrt((meshx - s1(1)).^2 + (meshy - s1(2)).^2 + (meshz - s1(3)).^2 ) < 15;

% Now let's do the work
div = [6 6 6]; % size of one submatrix

cells_x = ceil(x ./ div(1));
cells_y = ceil(y ./ div(2));
cells_z = ceil(z ./ div(3));

% The order of x and y is correct
[cmeshy, cmeshx, cmeshz] = meshgrid(cells_y, cells_x, cells_z);

% Here, the transformation happens.
volx = cmeshx(myspace);
voly = cmeshy(myspace);
volz = cmeshz(myspace);

newspace = zeros(size(myspace) ./ div);
indices = sub2ind(size(newspace), volx, voly, volz);
newspace(indices) = 1;

vol3d('cdata', newspace);
view(3) ;
全部清除
clc
x=1:336;
y=1:240;
z=1:120;
[meshy,meshx,meshz]=meshgrid(y,x,z);
%myspace只是作为逻辑矩阵的volumentric数据集
s1=[168 120 60];
myspace=sqrt((meshx-s1(1))。^2+(meshy-s1(2))。^2+(meshz-s1(3))。^2)<15;
%现在让我们来做这项工作
div=[6];%一个子矩阵的大小
单元x=单元(x./div(1));
单元y=单元(y./div(2));
cells_z=ceil(z./div(3));
%x和y的顺序是正确的
[cmeshy,cmeshx,cmeshz]=meshgrid(cells_y,cells_x,cells_z);
%在这里,转变发生了。
volx=cmeshx(myspace);
voly=cmeshy(myspace);
volz=cmeshz(myspace);
新闻空间=零(大小(myspace)。/div);
索引=sub2ind(大小(新闻空间)、volx、voly、volz);
新闻空间(指数)=1;
vol3d('cdata',新闻空间);
观点(3);
代码假定矩阵大小可以被子矩阵大小均匀整除。如果不是这样,则相应地截断或填充原始矩阵

在div变量指定子矩阵的大小后,计算单元变量。它们包含原始空间的每个索引,即新空间的索引。这些将用网格网格展开。现在,对于空间中的每个坐标,(x,y,z),新空间的坐标是(cmeshx(x,y,z),cmeshy(x,y,z),cmeshz(x,y,z))


然后,通过逻辑索引可以轻松完成转换。现在,vol(xyz)变量中有(x,y,z)元组。为了将这些数据放到新的空间中,计算并应用线性指数。

我提出了以下解决方案:

clear all
clc

x=1:336;
y=1:240;
z=1:120;

[meshy, meshx, meshz] = meshgrid(y, x, z);

% myspace is just your volumentric dataset as a logical matrix
s1 = [168 120 60];
myspace = sqrt((meshx - s1(1)).^2 + (meshy - s1(2)).^2 + (meshz - s1(3)).^2 ) < 15;

% Now let's do the work
div = [6 6 6]; % size of one submatrix

cells_x = ceil(x ./ div(1));
cells_y = ceil(y ./ div(2));
cells_z = ceil(z ./ div(3));

% The order of x and y is correct
[cmeshy, cmeshx, cmeshz] = meshgrid(cells_y, cells_x, cells_z);

% Here, the transformation happens.
volx = cmeshx(myspace);
voly = cmeshy(myspace);
volz = cmeshz(myspace);

newspace = zeros(size(myspace) ./ div);
indices = sub2ind(size(newspace), volx, voly, volz);
newspace(indices) = 1;

vol3d('cdata', newspace);
view(3) ;
全部清除
clc
x=1:336;
y=1:240;
z=1:120;
[meshy,meshx,meshz]=meshgrid(y,x,z);
%myspace只是作为逻辑矩阵的volumentric数据集
s1=[168 120 60];
myspace=sqrt((meshx-s1(1))。^2+(meshy-s1(2))。^2+(meshz-s1(3))。^2)<15;
%现在让我们来做这项工作
div=[6];%一个子矩阵的大小
单元x=单元(x./div(1));
单元y=单元(y./div(2));
cells_z=ceil(z./div(3));
%x和y的顺序是正确的
[cmeshy,cmeshx,cmeshz]=meshgrid(cells_y,cells_x,cells_z);
%在这里,转变发生了。
volx=cmeshx(myspace);
voly=cmeshy(myspace);
volz=cmeshz(myspace);
新闻空间=零(大小(myspace)。/div);
索引=sub2ind(大小(新闻空间)、volx、voly、volz);
新闻空间(指数)=1;
vol3d('cdata',新闻空间);
观点(3);
代码假定矩阵大小可以被子矩阵大小均匀整除。如果不是这样,则相应地截断或填充原始矩阵

在div变量指定子矩阵的大小后,计算单元变量。它们包含原始空间的每个索引,即新空间的索引。这些将用网格网格展开。现在,对于空间中的每个坐标,(x,y,z),新空间的坐标是(cmeshx(x,y,z),cmeshy(x,y,z),cmeshz(x,y,z))


然后,通过逻辑索引可以轻松完成转换。现在,vol(xyz)变量中有(x,y,z)元组。要将它们放入新的空间,需要计算并应用线性索引。

您已经有了基于循环的代码吗?如果你展示了一些代码,你会更容易理解你想要矢量化什么。你已经有基于循环的代码了吗?如果你展示了一些代码,你会更容易理解你想要矢量化什么。非常感谢,但是我在运行代码时遇到了一个问题。也许我误解了。我修改了代码,现在它有:“x=1:336;y=1:240;z=1:120;”,定义了“s1=[168 120 60]”,即在中心和“div=[6 6]”,重新定义了我的空间,使其在中心有一个大球体(更改为0.5到15)。但是结果是一个区域沿着X轴一直延伸。你能给我一些可视化代码吗?我在这方面遇到了一些问题,不得不使用变量视图进行检查……第一次调用meshgrid时仍然存在一个bug,现在已经修复了。当我执行上面的代码时,我在3D空间的中间看到一些像球体一样的斑点。谢谢。运行速度比我的版本快得多。因为我每天要做几百次手术,我现在有很多空闲时间可以用来放松。再次感谢。非常感谢,但是我在运行代码时遇到了问题。也许我误解了。我修改了代码,现在它有:“x=1:336;y=1:240;z=1:120;”,定义了“s1=[168 120 60]”,即在中心和“div=[6 6]”,重新定义了我的空间,使其在中心有一个大球体(更改为0.5到15)。但是结果是一个区域沿着X轴一直延伸。你能给我一些可视化代码吗?我在这方面遇到了一些问题,不得不使用变量视图进行检查……第一次调用meshgrid时仍然存在一个bug,现在已经修复了。当我执行上面的代码时,我在3D空间的中间看到一些像球体一样的斑点。谢谢。跑得很快