Matlab:从单元矩阵到结构的数据。如何使用密钥组织数据?

Matlab:从单元矩阵到结构的数据。如何使用密钥组织数据?,matlab,data-structures,struct,dataset,organization,Matlab,Data Structures,Struct,Dataset,Organization,让我假设我面对的是一些通过SQL数据库查询获得的数据,如下所示(当然,我的实际情况更大,有很多行和很多列) 我的目标是以智能有效的方式在Matlab中组织数据(在工作中我必须使用它),以获得以下结果: 按键访问数据获取整行,如dataset(键:) 通过键加标头访问数据,返回单个值dataset.header(键) 如果可能,获取整个列(用于所有键) 首先,我使用了统计工具箱提供的dataset类,因为它具有所有这些特性,但我决定离开它,因为它非常慢(从我得到的情况来看,它基本上是单元格数组

让我假设我面对的是一些通过SQL数据库查询获得的数据,如下所示(当然,我的实际情况更大,有很多行和很多列)

我的目标是以智能有效的方式在Matlab中组织数据(在工作中我必须使用它),以获得以下结果:

  • 按键访问数据获取整行,如
    dataset(键:)
  • 通过键加标头访问数据,返回单个值
    dataset.header(键)
  • 如果可能,获取整个列(用于所有键)
首先,我使用了统计工具箱提供的
dataset
类,因为它具有所有这些特性,但我决定离开它,因为它非常慢(从我得到的情况来看,它基本上是单元格数组的包装器):我代码的瓶颈是获取数据,而不是执行计算。事实上,我读到最好尽量避免它

较新的类
看起来效率更高,但仍然不是很高:据我所知,它是官方文件中解释的
数据集
的新版本

我也考虑过使用
containers.Map
,但它似乎不能同时通过键和列进行访问

因此,
struct
似乎是最好的选择,因为它速度非常快,并且具有我想要的所有功能

所以我的问题是:

  • 有人面对过我同样的问题吗?哪种数据组织方式是最好的
  • 让我假设
    struct
    是最好的。如何有效地创建和填充这样的结构:
    mystruct.key.header
我想得到这样的东西:

 mystruct.key1.header1
 ans = a
当然我可以循环,但一定有更好的方法。我已记录,但结构创建为空:

fn1 = {'a', 'b', 'c'}; %first level
fn2 = {'d', 'e', 'f'}; %second level
s2 = cell2struct(cell(size(fn2(:))),fn2(:));
s = cell2struct(repmat({s2},size(fn1(:))),fn1(:))
在文档中,所有示例并不重命名所有级别。帮助是填充数据的好方法(取决于Matlab版本,从7.0开始,它被一种新的编码风格所取代),但我仍然缺少如何将创建结构的部分与填充结构结合起来


非常感谢您的任何建议或代码示例。

如果您认为或确信结构化是您的最佳选择,您可以使用。首先,将所有数据作为表格导入Matlab,然后将其转换为结构

mystruct = table2struct(data);
要访问数据,请使用以下语法:

mystruct(key).header
如果
key
是一个数组,则需要使用单元格数组将所有值收集到列表中:

values = {mystruct(key).header}
或不同的变量:

[v1, v2, v3] = mystruct(key).header
但是,如果你不确定有多少产出是可以预期的,那么后一种选择是有问题的


我不确定什么对您更方便,但您也可以通过将
'ToScalar'
参数设置为
true

来转换为标量结构。我个人使用
,发现它既高效又方便。在我看来,这是满足您需求的完美解决方案。如何将数据导入Matlab?你使用数据库浏览器吗?我使用数据库工具箱,所以基本上我调用
exec
并获取结果。导入和存储数据没有问题,但访问存储的数据却有问题:分析代码我发现瓶颈是
dataset/subref
,因此我想切换到一个更快的数据“容器”。我所说的得到了证实。作为个人练习,我试图在没有结果的情况下填充
结构
,但我得到的唯一有效解决方案是一个糟糕的嵌套循环。即使您更喜欢
,您是否有一些提示来填充嵌套的
结构
中的数据?
[v1, v2, v3] = mystruct(key).header