matlab - 四面体面的大型、大部分为空的数据结构

标签 matlab data-structures tetrahedra

我正在尝试将四面体中每个面的节点 ID 与其对应的四面体 ID 相关联。

tetras = [1 2 3 4  % Tetra 1
          5 6 7 8] % Tetra 2

对于 tetra 1,有四个面:

faces = [1 2 3; 1 2 4; 1 3 4; 2 3 4] % Notice these are sorted

然后我想将这些存储在数据结构中:

tet_for_face = cell(8,8,8) % 8 allows for the maximum node id

tet_for_face{1,2,3} = 1;
tet_for_face{1,2,4} = 1;
tet_for_face{1,3,4} = 1;
tet_for_face{2,3,4} = 1;

这意味着我可以在 O(1) 中找到任何特定面孔的四面体 ID:

tet_for_face{2,3,3}
ans = []
tet_for_face{2,3,4}
ans = 1

这种方法的问题在于它需要连续的内存。随着我的网格变大,我的内存用完了:

cell(1000, 1000, 1000)
??? Error using ==> cell
Out of memory. Type HELP MEMORY for your options.

我也尝试过使用嵌套单元格:

tet = cell(num_nodes, 1);
tet2 = cellfun(@(x) cell(num_nodes, 1), tet, 'UniformOutput', 0);
tet3 = cellfun(@(x) cellfun(@(y) cell(num_nodes, 1), x, 'UniformOutput', 0), tet2, 'UniformOutput', 0);

tet3{2}{3}{4} = 1;
...

虽然这适用于小网格,并且不需要连续内存(AFAIK),但它有一个坏习惯,即在 N=1000 时使 MATLAB 崩溃。

有什么想法吗?

最佳答案

在尝试使用稀疏数组(只能是 1D 或 2D,不能是 3D)并且一无所获之后,我决定使用 containers.Map (HashMap)。

我使用字符串键,我发现生成它们的最快方法是使用 sprintf(而不是 int2str 或 mat2str)

示例代码:

tet = containers.Map;
for tetra_id in tetras 
    for face in faces
        face_key = sprintf('%d ', face);
        tet(face_key) = tetra_id;

这给了我一张这样的 map :

tet('1 2 3') = 1

关于matlab - 四面体面的大型、大部分为空的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12724751/

相关文章:

matlab - 在 Matlab 中从大型文本文件中读取数据

r - R 中的 Circle Packing - 数据结构

python - 如何通过 matplotlib 绘制四面体网格?

c++ - 构建一组随机点的四面体 - 四面体化

c - 如何用C读取.cnf文件( union 范式)?

mesh - 四面体网格

matlab - 如何从 MATLAB 中的 .fig 文件中提取数据?

matlab - 在 Matlab 中将一个矩阵复制到另一个矩阵

matlab - 是否可以在 MATLAB 中强制执行输入参数数据类型?

java - 为什么a(Map对象)的值的数据类型改变了?