Matlab:将ID与数据集(例如结构)相关联?

标签 matlab data-structures struct finite-element-analysis

我正在 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

因此,我提出的一种方法是将所有内容存储在二维双矩阵中,然后在需要时进行一些相对复杂的索引来访问我的数据。对于上面的示例,我的二维矩阵的大小为

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 特定功能的东西。

那么,对于如何以干净的方式实现此功能有什么想法吗?我希望我的问题有意义,并提前致谢!

最佳答案

方法 2 是最简洁的,并且很容易转换为 C++。对于每个节点,您都有一个 struct s,然后:

data(nodeID) = s;

就是所谓的结构体数组。您索引为

data(id).b(3,3) = 0.0;

这假设 ID 是连续的,或者它们的值没有巨大的差距。但这始终是可以保证的,如果需要,很容易对节点 ID 进行重新编号。


在 C++ 中,您将拥有一个结构向量:

struct Bla{
   double a;
   double b[3][3];
   double c[10];
};

std::vector<Bla> data(N);

或者在C中:

Bla* data = malloc(sizeof(Bla)*N);

(完成后不要忘记free(data))。

然后,在 C 或 C++ 中,您可以通过以下方式访问元素:

data[id].b[2][2] = 0.0;

转换是显而易见的,只不过索引在 C++ 中从 0 开始,在 MATLAB 中从 1 开始。


请注意,此方法在 MATLAB 中比方法 1 具有更大的内存开销,但在 C 或 C++ 中则不然。

方法 3 是一个坏主意,它只会减慢代码速度,没有任何好处。

关于Matlab:将ID与数据集(例如结构)相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678807/

相关文章:

matlab - 绘制没有显式变量名的匿名函数

python-2.7 - 区分手写和机器打印的文本

C++ 使用数组结构创建平衡二叉搜索树

Python 数组内存占用与列表

c# - X # 列表的深度差异

c - 访问其范围之外的本地声明的结构

c - 如何在 Windows 中打印\n?

matlab - 使用经过训练的高斯混合模型标记新数据

c++ - 用 C++ 将不同的结构写入文件?

c - 使用结构从动态数组的变量返回随机值