Arrays 能否将Matlab数组和结构的复合数据存储和查询到数据库中? 如何将位于“struct in struct in struct in struct”中的Matlab数组存储到数据库中,以便检索字段和数组?

Arrays 能否将Matlab数组和结构的复合数据存储和查询到数据库中? 如何将位于“struct in struct in struct in struct”中的Matlab数组存储到数据库中,以便检索字段和数组?,arrays,database,matlab,hdf,Arrays,Database,Matlab,Hdf,以下是我为什么需要这个的更多细节: 我有成吨的数据保存为.mat文件…麻烦的是我需要加载一个完整的.mat文件来开始处理和绘制那里的数据。如果该文件很大,那么将其加载到内存中就成了一项相当艰巨的任务 这些.mat文件是通过分析晶体管的原始电气测量数据得到的。所有.mat文件都具有相同的结构,但每个文件对应一个不同且唯一的晶体管 现在假设我想比较a和B中常见的所有晶体管中的某个参数,我必须手动搜索并加载所有需要的.mat文件,然后尝试进行比较。没有简单的方法将所有这些.mat文件合并到一个.mat

以下是我为什么需要这个的更多细节:

我有成吨的数据保存为.mat文件…麻烦的是我需要加载一个完整的.mat文件来开始处理和绘制那里的数据。如果该文件很大,那么将其加载到内存中就成了一项相当艰巨的任务

这些.mat文件是通过分析晶体管的原始电气测量数据得到的。所有.mat文件都具有相同的结构,但每个文件对应一个不同且唯一的晶体管

现在假设我想比较a和B中常见的所有晶体管中的某个参数,我必须手动搜索并加载所有需要的.mat文件,然后尝试进行比较。没有简单的方法将所有这些.mat文件合并到一个.mat文件中(因为它们都有相同的变量名,但数据不同)。即使这是可能的,我也不知道如何从.mat文件中查询特定条目

如果没有可以查询特定条目的结构化数据库,我看不到一种轻松做到这一点的方法。然后我可以使用任何编程语言(继续使用Matlab或切换到python)方便地进行比较和绘图…等等。没有散乱的.mat文件的麻烦

问题是.mat文件中的数据是以结构和大数组的形式构造的。据我所知,将其存储在简单的SQL数据库中并不是一项简单的任务。我使用HDF5查找,但从我看到的,我必须执行许多低级命令来将这些结构存储在HDF文件中,我不确定是否可以将HDF文件的一部分加载到Matlab/python中,或者是否还必须首先将整个文件加载到内存中

这里的目标是将所有现有的(以及待创建的).mat文件(及其结构和数组的复合数据结构)合并到一个数据库文件中,我可以从中查询特定条目。是否有一个数据库解决方案可以保留我复杂数据的结构?HDF是一条路吗?还是我缺少一个简单的解决方案?

编辑:

我需要保存和检索的数据示例:

All(16).rf.SS(3,2).data
其中
All
是一个包含7个字段的结构数组。
rf
字段中的每个结构都是一个包含数组、整数、字符串和结构的结构。其中一个结构名为
SS
,它又是一个结构数组,每个结构包含一个名为
data

的2x2数组,将.mat文件合并到一个数据结构中 一般来说,没有简单的合并方法是不正确的。mat文件转换为单个.mat文件(因为它们都有相同的变量名,但数据不同)

假设您有两个文件,
data1.mat
data2.mat
,每个文件都包含两个变量,
a
b
。你可以做:

>> s = load('data1')
s = 
  struct with fields:

    a: 'foo'
    b: 3

>> s(2) = load('data2')
s = 
  1×2 struct array with fields:
    a
    b
现在您有了一个(请参见下面的注释)。您可以通过以下方式访问其中的数据:

>> s(1).a
ans =
    'foo'

>> s(2).a
ans =
    'bar'
但是,您也可以一次获取每个字段的所有值,例如,可以将其分配给单元格数组或矩阵:

>> s.a
ans =
    'foo'
ans =
    'bar'

>> allAs = {s.a}
allAs =
  1×2 cell array
    {'foo'}    {'bar'}

>> allBs = [s.b]
allBs =
     3     4
注意:令人烦恼的是,在使用索引分配给结构之前,似乎必须先创建具有正确字段的结构。换句话说

s = struct;
s(1) = load('data1')
不起作用,但是

s = struct('a', [], 'b', [])
s(1) = load('data1')
没关系

建立.mat文件的索引 如果您不需要搜索每个.mat文件中的所有数据,只需搜索某些字段,则可以在MATLAB中构建一个索引,其中只包含每个.mat文件中的相关元数据以及文件本身的引用(例如文件名)。作为一个长期的解决方案,这种方法不太可靠,因为您必须确保索引与文件保持同步,但设置起来的工作量应该更少

将数据结构展平到与数据库兼容的表中 如果确实希望将所有内容都保存在数据库中,则可以将数据结构转换为表格形式,其中任何多维元素(如结构或数组)都被“展平”为表行,每个(适当命名的)表变量具有一个标量值

例如,如果您有一个带有字段
s.a
s.b
的结构
s.b
,并且
s.b
是一个2 x 2矩阵,您可以调用变量
s_a
s_b_1_1
s_b_1_2
,但您可能没有得到理想的数据库设计


您应该能够调整和/或MATLAB文件交换提交中的代码,以满足您的需要。

在MATLAB世界之外,这被称为ORM或对象关系映射器。谢谢@MSalters!查找后,找不到与Matlab相关的内容……将.mat文件导入python,然后将其保存到面向对象数据库中是否合乎逻辑?然后从那里继续使用python?这里不是专家,但这很有意义。Python(带有SciPy/NumPy)是MatLab的一个重要竞争对手,正是因为它与世界其他地方的集成度更好。是的……我现在必须使用.mat文件……我将查找一个。如何将.mat文件导入python和b。如何用python ORM保存这些导入的.mat文件…如果两者都正确,这将解决问题。您能给我们展示一个“struct in struct in struct in struct”数据的示例吗?使用Python可以存储和检索.mat文件,但这并不意味着您可以搜索和过滤这些文件中字段的值。如果你能做到这一点很重要,你最好集中精力在MATLAB中重新组织数据,这样你就可以使用原生数据结构(见我的答案)或将其转换为数据库友好的表格式。在MATLAB中确实可以做到……到目前为止,我一直在做这件事。然而,当你有数百个.mat文件,只想比较其中4个或5个文件的数据时……我可以选择