【问题标题】:Select nodes of a mesh data with matlab to set boundary conditions用matlab选择网格数据的节点来设置边界条件
【发布时间】:2016-05-29 09:13:09
【问题描述】:

我已将带有网格数据的曲面的 2Dmesh 文件导入 matlab。

这个网格文件有 3 列:第一列是节点编号,第二列是节点的 x 坐标,第三列是节点的 y 坐标。

我想选择这个圆内的节点x²+y² = 4。将数据文件导入matlab后,我有三个列向量,节点向量,x坐标向量和y坐标向量。

有任何提示可以强制执行 x² + y²

【问题讨论】:

  • 圆圈是 x²+y² = 4。在这个圆圈内有一些节点想知道它的节点编号,以便在这些节点中设置位移。这个圆圈里面的节点可能有100个左右,所以我想得到一个列向量和这个节点的个数。

标签: matlab vector


【解决方案1】:

您可以通过并行扫描三个向量的 for 循环轻松做到这一点。

首先,您可能想要检查这 3 个向量是否具有相同的长度。假设x 是具有x 坐标的向量,y 是具有y 坐标的向量,idx 是具有节点编号的向量。

if(length(x)~=length(y) || length(x)~=length(idx) || length(y)~=length(idx))
   error('Vectors must have the same length.');
end

然后你就可以继续了。

SelectedNodes=[];
for i=1:length(x) %or length(y) or length(idx)...they must have the same length
    if(x(i)^2+y(i)^2<4)
        SelectedNodes=[SelectedNodes idx(i)];
    end
end

现在在SelectedNodes 中,您拥有圈内节点的 ID,要知道圈内有多少节点,只需评估其长度 (length(SelectedNodes))。

更新:正如@rayryeng 正确指出的那样,通过使用逻辑索引而不是 for 循环,有一种更聪明的方法来做到这一点。如果向量(或矩阵)的i-th 元素满足特定条件,则逻辑索引(用糟糕的话来说)将逻辑1 (true) 放在i-th 位置。否则会有一个逻辑0(假)。按照建议运行,

SelectedNodes=idx(x.^2+y.^2<4)

代码x.^2+y.^2&lt;4 将返回一个与x(和y)长度相同的数组,其中包含1s 或0s,位置为i,具体取决于x 中是否存在此类元素y 满足圆方程。这样的数组将是idx 的输入,这意味着“从idx 中选择标记为true 的值”。最后,这将是存储在SelectedNodes 中的结果。

【讨论】:

  • SelectedNodes = idx(x.^2 + y.^2 &lt; 4) 会更有效率吗?使用logical 索引可以提高您编写的代码的效率。 for 这里不需要循环。
  • 当然可以。但是通过for 循环,您实际上可以逐步看到正在发生的事情。在第二步中,您还可以通过避免循环等来优化您的代码。
  • 当然,我明白您为什么要使用for 循环,但我认为如果要成为一名认真的 MATLAB 用户,您会想要采用良好的做法。另外,考虑使用numel 而不是length...不过这只是我个人的偏好。
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2018-05-05
  • 2021-02-27
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多