【发布时间】:2017-11-24 13:32:07
【问题描述】:
我正在为 Matlab 中的“观察变量”表搜索一些优化的数据类型,可以通过列(通过变量)和行(通过观察)快速轻松地访问这些数据类型。
这是现有 Matlab 数据类型的比较:
- Matrix 非常快,但是,它没有内置的维度索引标签/枚举,而且您不能总是按列索引记住变量名称。
- 表格的性能很差,尤其是在 for 循环中读取单个行/列时(我想它会运行一些缓慢的转换方法,并且设计得更像 Excel)。
- 标量结构(列数组的结构)数据类型 - 快速按列访问变量作为向量,但按行缓慢转换为观察值。
- 非标量结构(结构数组) - 以行方式快速访问作为向量的观测值,但按列方式转换为变量的速度较慢。
我想知道是否可以使用一些更简单和优化的 Table 数据类型版本,如果我只想将行号和列变量索引与仅数字变量 - 或 - 任何变量类型结合起来。
测试脚本结果:
----
TEST1 - reading individual observations
Matrix: 0.072519 sec
Table: 18.014 sec
Array of structures: 0.49896 sec
Structure of arrays: 4.3865 sec
----
TEST2 - reading individual variables
Matrix: 0.0047834 sec
Table: 0.0017972 sec
Array of structures: 2.2715 sec
Structure of arrays: 0.0010529 sec
测试脚本:
Nobs = 1e5; % number of observations-rows
varNames = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'};
Nvar = numel(varNames); % number of variables-colums
M = randn(Nobs, Nvar); % matrix
T = array2table(M, 'VariableNames', varNames); % table
NS = struct; % nonscalar structure = array of structures
for i=1:Nobs
for v=1:Nvar
NS(i).(varNames{v}) = M(i,v);
end
end
SS = struct; % scalar structure = structure of arrays
for v=1:Nvar
SS.(varNames{v}) = M(:,v);
end
%% TEST 1 - reading individual observations (row-wise)
disp('----'); disp('TEST1 - reading individual observations');
tic; % matrix
for i=1:Nobs
x = M(i,:); end
disp(['Matrix: ', num2str(toc()), ' sec']);
tic; % table
for i=1:Nobs
x = T(i,:); end
disp(['Table: ', num2str(toc), ' sec']);
tic;% nonscalar structure = array of structures
for i=1:Nobs
x = NS(i); end
disp(['Array of structures: ', num2str(toc()), ' sec']);
tic;% scalar structure = structure of arrays
for i=1:Nobs
for v=1:Nvar
x.(varNames{v}) = SS.(varNames{v})(i);
end
end
disp(['Structure of arrays: ', num2str(toc()), ' sec']);
%% TEST 2 - reading individual variables (column-wise)
disp('----'); disp('TEST2 - reading individual variables');
tic; % matrix
for v=1:Nvar
x = M(:,v); end
disp(['Matrix: ', num2str(toc()), ' sec']);
tic; % table
for v=1:Nvar
x = T.(varNames{v}); end
disp(['Table: ', num2str(toc()), ' sec']);
tic; % nonscalar structure = array of structures
for v=1:Nvar
for i=1:Nobs
x(i,1) = NS(i).(varNames{v});
end
end
disp(['Array of structures: ', num2str(toc()), ' sec']);
tic; % scalar structure = structure of arrays
for v=1:Nvar
x = SS.(varNames{v}); end
disp(['Structure of arrays: ', num2str(toc()), ' sec']);
【问题讨论】:
-
应使用
timeit进行计时以获得准确的结果。此外,只需使用矩阵并在上面/后面/下面或列包含的某处添加评论。在通常是第一个评论部分的一部分的函数中,即当您键入help FunctionName时得到的函数 -
我已经检查过了,并用
timeit定时给出或多或少相同的结果。 -
我原以为 gnovice 的容器。地图解决方案会适合您的喜好。这是我对这个问题的最初反应。我唯一能想到的另一件事是扩展一个像 struct 这样的基本类。
标签: matlab matrix data-structures dataset tuples