我想在Matlab中指定域,如下所示。事实证明,这比我想象的要困难。到目前为止,我尝试了两种方法:
从逻辑上讲,第二种方法如下所示:
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?!
或者,我在考虑这样的事情:
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。我真的更愿意把他们排除在外。
这些方法都不管用,我想知道是否有更好、更直接的方法?
发布于 2017-11-05 15:42:08
你只需要准备一个边缘的二进制掩码,如果你是矩阵名是m
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;然后:
m.*~mask会得到你想要的..。

此图是使用fex的blockPlot和m=ones(7,9,11);创建的。
https://stackoverflow.com/questions/47123025
复制相似问题