首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for循环在Matlab中指定无角立方体的域

使用for循环在Matlab中指定无角立方体的域
EN

Stack Overflow用户
提问于 2017-11-05 15:02:06
回答 1查看 34关注 0票数 0

我想在Matlab中指定域,如下所示。事实证明,这比我想象的要困难。到目前为止,我尝试了两种方法:

  1. 小到大的方法。在这里,我从定义中间的立方体开始,然后添加突出的6个块。最后,我得到了7个区域,每个域都指定了主要方程和边界条件。这似乎是可行的,但显然是非常缓慢。我更喜欢类似于2的解决方案,即:
  2. 大到小的方法。在这里,我从一个比实际区域更大的立方体开始,我想告诉Matlab哪些部分要排除在域之外,例如角落中的部分。假设拐角从i/j/k=1到i/j/k=2。在这里,我不知道如何做到这一点。具体而言,如果这三个坐标中的任何一个是1或nx/ny/nz,那么其他两个坐标的范围应该是2:(nx/ny/nz-1)。

从逻辑上讲,第二种方法如下所示:

代码语言:javascript
复制
for i=1:nx
for j=1:ny
for k=1:nz

%x
if (j==1||j==ny) for i=2:(nx-1)
elseif (k==1||k==nz) for i=2:(nx-1)
else for i=1:nx
end

%y
if (i==1||i==nx)for j=2:(ny-b1)
elseif (k==1||k==nz)for j=2:(ny-1) 
else  for j=1:ny
end

%z
if (i==1||i==nx) for k=2:(nz-1)
elseif (j==1||j==ny) for k=2:(nz-1)
else for k=1:nz
end

我知道这不是有效的Matlab语法,因为后面的for -if语句,但这是一个明确的概念,我想要什么。我的问题是,有没有另一种方式来写这样的工作在Matlab?!

或者,我在考虑这样的事情:

代码语言:javascript
复制
for i=1:((nx/3))
for j=1:ny
for k=1:nz

if(i==(2||(nx-2))&&(k==1||k==nz ||j==1||j==ny))  ux(i,j,k)=BC1;
elseif(i==1&&k~=1&&k~=nz&&j~=1&&j~=ny) ux(i,j,k)=BC2;
elseif(i==1) ux(i,j,k)=0; %here also u and uxx need to be set 0. 
else definition ux
end

这方面的问题是,您仍然必须在角点指定i==1,例如,不要将角点排除在域之外,而是包括角点,并将所有角相关值设置为0。我真的更愿意把他们排除在外。

这些方法都不管用,我想知道是否有更好、更直接的方法?

要描述的域的图片

EN

回答 1

Stack Overflow用户

发布于 2017-11-05 15:42:08

你只需要准备一个边缘的二进制掩码,如果你是矩阵名是m

代码语言:javascript
复制
mask=zeros(size(m));
mask(1,:,end)=1;
mask(end,:,1)=1;
mask(1,:,1)=1;
mask(end,:,end)=1;
mask(:,1,1)=1;
mask(:,1,end)=1;
mask(:,end,1)=1;
mask(:,end,end)=1;
mask(1,1,:)=1;
mask(1,end,:)=1;
mask(end,1,:)=1;
mask(end,end,:)=1;

然后:

代码语言:javascript
复制
m.*~mask

会得到你想要的..。

此图是使用fex的blockPlotm=ones(7,9,11);创建的。

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

https://stackoverflow.com/questions/47123025

复制
相关文章

相似问题

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