简而言之,不,在 Matlab 中不可能做到这一点。这与 Matlab 的基本数据类型的工作方式不一致。但没关系。在 Matlab 中进行表格式工作的高效方法是使用您已经拥有的东西——单元格或其他包含列作为同构数组的复合类型——但更改代码以在它们上使用向量化的面向列的函数。
听起来你在问如何在 Matlab 中构造一个类似表的对象,以便具有异构类型的记录的字段在内存中是连续的,例如 C struct 或传统的面向记录的 RDBMS 表物理布局。 Matlab 的数据类型不是这样工作的。 Matlab 的所有原始数组都是同类类型的,在内存中连续布局;所有异构类型都是由引用它们“包含”的原始数组的单元、结构、对象或其他复合类型构建的。
因此,您可以通过多种方式构建具有不同列类型的表格,使用您正在做的单元格、table 或滚动您自己的关系样式类。但是它们都归结为复合类型,将不同的原始类型存储在单独的原始数组中,因此它们都具有与基于单元的实现相同的访问时间特征。您当前的“列单元阵列”结构很好,并且是您在 Matlab 中表示该数据的典型方式。其他实现将为您提供不同的语法和更强大的功能来使用——这是使用它们的一个很好的理由——但它们的底层数据结构看起来非常像你已经拥有的。 (对于它的价值,@Marcin 提到的 table 数据类型听起来很棒:方便的语法和一组不错的函数。但它基本上是基于单元的解决方案之上的包装器,具有相同的性能特征。)
Matlab 不是为迭代具有异构字段的单个“记录”并一次处理一个或几个而构建的,这在许多其他语言中很常见。为了在 Matlab 中快速运行,您必须重新组织算法以跨列或其他原始数组的元素进行操作。这就是“矢量化” 的本质。你能行的;各种关系式操作都可以在惯用的 Matlab 代码中高效地完成,使用 ismember、unique、索引映射、accumarray 等内容。你只需要改变你的方法。
替代品
在 Matlab 中做“表”的另一种方法是做结构或单元的数组,其中结构或单元的每个字段都保存一个标量值。 (一个 M 行乘 N 列表是一个 M 长数组 T 的结构,每个都有 N 个字段;T(i) 获取第 i 行。)这将使您更快地访问单个“记录”,因为它是已经建成。但它在速度和内存方面都很糟糕,因为每条记录的每个元素都存储在它自己的 1×1 原始数组中。 (例如,M rows by N cols table 最终使用 O(M*N) 原始数组而不是 O(N)。)并且您不能在该排列上使用任何矢量化操作。
其他一些想法
如果您有任何字符串列,您可能需要构建一个或两个自定义字符串类型。 Matlab 的基本字符串类型char 和cellstr 速度慢且占用大量内存,并且不支持您可能希望对列执行的某些多态操作。
小心那些int 类型。由于历史原因,Matlab 对混合类型算术的提升规则很奇怪。当它们混合时,双精度数会缩小到整数,并且它们最终可能会“污染”传递给它们的函数中的数据。这使得 int 在实践中没有你想象的那么有用;你需要在他们周围有保护代码。
(严格来说,你可以通过下拉到 MEX 或 Java 并在那里编写所有代码来做连续记录风格的东西,但是你只是在编写 C 或 Java 而不是 Matlab,在这种情况下为什么要使用 Matlab ?)