【发布时间】:2019-09-04 19:45:24
【问题描述】:
我正在为 Matlab 中的高阶有限元模拟算法开发某个功能,我想知道什么是实现某个任务的好方法。我相信我面临着一个普遍的问题,但是在进行了一些挖掘之后,我并没有真正找到一个好的解决方案。
基本上,我有一长串 ID(对应于我的网格上的某些节点),其中每个 ID 都与小数据集相关联。然后,当我运行求解器时,我需要访问与这些节点关联的数据并更新数据(多次)。
例如,假设这是我的这些特定节点的列表:
nodelist = [3 27 38] %(so these are my node ID's)
然后对于每个节点,我关联了以下数据集
a (scalar)
b (5x5 double matrix)
c (10x1 double vector)
(a total of 36 double values associated with each node ID)
实际上,我当然会有更长的节点 ID 列表和与每个节点关联的更大的数据集(但仍然只有双标量、矩阵和向量(没有字符、字符串等))。
方法 1
所以我设计的一种方法是将所有内容存储在 2D 双矩阵中,然后在需要时进行一些相对复杂的索引来访问我的数据。对于上面的示例,我的 2D 矩阵的大小将是
size(2Dmat) = [length(nodelist), 36]
假设我想访问节点 ID 27 的 b(3,3),我将访问 2Dmat(2,14)。
原则上,这是可行的,但是由于这种复杂的索引,代码不是很干净和可读(更不用说,当我更改数据集的设置方式时,我需要重新调整整个索引代码)。
方法 2
另一种方法是为节点列表中的每个节点使用某种结构:
a = 4.4;
b = rand(5,5);
c = rand(10,1);
s = struct('a',a,'b',b,'c',c)
然后我可以通过例如 s.b(3,3) 等访问数据。但我只是不知道如何将结构与节点 ID 相关联?
方法 3
我能想到的最后一件事是设置某种 SQL 数据库,但这似乎有点矫枉过正。此外,我需要我的代码尽可能快,因为我需要多次访问与这些选定节点关联的数据集中的这些字段,我想对数据库进行一些查询会减慢速度。
请注意,我最终会将代码从 Matlab 转换为 C/C++,因此我更愿意实现一些不太依赖于某些 Matlab 特定功能的东西。
那么,对于如何以干净的方式实现此功能有什么想法吗?我希望我的问题有意义,并提前感谢!
【问题讨论】:
-
我至少会考虑使用
cells和cell arrays。 -
为什么不在 ID 结构中添加另一个字段?
-
虽然现在我想起来了,也许一个以 ID 为键并以结构数组的索引为值的 Map 会更好,因为它可以更快地访问。
-
您可以使用列表地图吗?关键是列表名称:mathworks.com/help/matlab/map-containers.html
标签: matlab data-structures struct finite-element-analysis