【发布时间】:2020-01-26 15:54:15
【问题描述】:
当我遇到以下挑战时,由于各种原因,我正在使用 tables 作为常规数值数组的替代品:如何(预)分配具有非标量变量的表?
给定这样的循环:
function A = myfun(...)
N = large number
A = zeros(N,4);
for i = 1:N
do stuff
A(i,:) = [scalar, vector];
end
我想返回一个带有命名变量的表。
我可以简单地改写为:
function T = myfun2(...)
N = large number
A = zeros(N,4);
for i = 1:N
do stuff
A(i,:) = [scalar, vector];
end
T = table(A(:,1), A(:,2:end),'VariableNames',{'scalar','vector'});
这显然会产生一个格式如下的表格:
T =
N×2 table
scalar vector
______ ___________
0 0 0 0
0 0 0 0
0 0 0 0
... ...
现在,如果我想预先分配输出表并为每次迭代更新它,我会尝试以下方式:
function T = myfun3(...)
N = large number
T = table('Size',[N,2],...
'VariableTypes',{'double','double'},...
'VariableNames',{'scalar', 'vector'});
for i = 1:N
do stuff
T(i,:) = {scalar, vector};
end
myfun3的问题在于T的格式是:
T =
N×2 table
scalar vector
______ ______
0 0
0 0
0 0
很明显,变量“向量”现在是标量而不是数组/向量。从table 文档中阅读,'size' 类型的预分配似乎不能接受数组大小?
Q1:如何使用非标量变量预分配table?
Q2:如果myfun2 中的A 很大,开销是否不好,或者这是一个可以接受的解决方案?
我担心索引入/出表的额外开销与数字数组相比非常大,这会对性能代码产生不利影响。
======= 编辑 =======
我联系了 MathWorks,他们确认从 MATLAB R2019b 开始,使用 size 参数无法实现 Q1。
【问题讨论】:
-
正如@Bentoy13 的回答所示,虽然您可以创建一个表并在其上循环,但这可能非常慢(可能比填充数组然后在结束。)我是表格的忠实粉丝,但它们必须与大小写一起使用。
标签: matlab performance matlab-table