【问题标题】:how to store data without dynamically naming variables如何在不动态命名变量的情况下存储数据
【发布时间】:2016-02-16 12:18:41
【问题描述】:

我有 40 个变量。 40 个变量名称位于一个元胞数组 (40 x 1) 中。

每个变量都有一个矩阵。该矩阵是双精度类型,大小为 5000 x 150。它还有一个大小为 1 x 150 的向量和一个最后一个向量 1 x 4。

最初我打算用元胞数组中的变量名动态命名每个结构。所以看起来像下面这样(假设变量名是 ABC),

ABC.dataMatrix
ABC.dataVec
ABC.summaryData

所有变量都会保存到一个目录中。

但是我读到使用 eval 并不是一个好主意,所以猜测我的想法并不是解决这个问题的最佳方法。解决这个问题的最佳方法是什么?

【问题讨论】:

  • 为什么不使用结构数组?喜欢ABC(i).dataMatrix。目前尚不清楚为什么必须使用eval
  • 为什么不使用dynamic field names

标签: matlab


【解决方案1】:

您可以按照@Shai 和@RobertStettler 的建议将struct 数组与dynamic field names 一起使用。

但是,另一个选项是table。如果您想在一个大矩阵中查看数据,这可能更有吸引力,并且您也可以为每个 table 行指定变量的名称!请注意,table 中的行将是您所称的变量,但 MATLAB 将 table 列称为其变量。

另请注意,使用table 可能比使用structcell 数组更难,但如果您知道如何使用它们,您也可以处理table

一个例子:

% create dummy data
rowNames = {'a';'b';'c'};
M = {ones(3); zeros(3); nan(3)}; % a cell, one element per item in rowNames
V = [1 2; 3 4; 5 6]; % a matrix of vectors, each row containing a vector for every item in rowNames

% create a table
T = table(M,V,'RowNames',rowNames); % this is where your variable names could go

现在,要访问您可以使用的数据(一些示例):

  • T(2,:)T('b',:),为 'b' 行中的所有数据返回 table
  • T(:,2)T(:,'V'),为所有行返回变量 Vtable
  • T.VT{:,2}T{:,'V'}T.(2),为所有行返回矩阵 V。此语法类似于访问 struct 的(动态)字段名称。
  • T{3,1}T{'c',1}T.M('c'),返回 cell M 为行 'c'。此语法类似于访问 cell,但具有更高级的可能性,即能够通过行名或变量名访问表。
  • T{3,1}{:}T{'c',1}{:}T.M{'c'},返回cell 内容M 为行'c'

甚至更复杂:T('a',:).M{:} 是访问M'a' 的单元格内容的复杂方法,可以使用T{1,1}{:}T.M{'a'}T{'a','M'}{:}T.M{1} 完成也是。

在你的情况下你会得到一个40x3 table,每一行你称之为变量,第一列矩阵(在cell数组中),最后两列向量(以及@ 987654368@ 数组或40xm doublem 是向量的长度)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多