如何在MATLAB中大型符号矩阵操作中预分配内存

时间:2013-05-27 15:24:42

标签: matlab symbolic-math

如何在MATLAB中的大型符号矩阵操作中预分配内存。

例如:在下面给出的代码中,变量“Toc”和“Tnw”的大小在每次迭代中增加。我已尝试按Toc = zeros(0,50)进行预分配,但出现错误“从sym转换为double 时出错”。那么Preallocation的语法的符号版本是什么?

syms c z
Tnw = 1;
for i = 1:9
    Toc(c, z) = [(1-c)*z c-c*z ; -c+c*z (1+c)*z];
    f = collect(Toc(c,z));
    Tnw = Tnw*f;
end

那么在大型符号操作中用于预分配的最佳实践是什么?

提前致谢

1 个答案:

答案 0 :(得分:2)

首先,zeros(0,50)不会分配任何东西。这不是一个空的载体。它也是double类型的向量,这就是当您尝试在其中存储符号值时出现错误的原因。我不确定“最佳实践”,但这是我分配符号数组的方式。

Toc = sym(zeros(1,50));

分配双数组,然后重新编号为符号。 UPDATE :在较新版本的Matlab中,您可以使用zeros(1,50,'sym')zeros(1,50,'like',Y),其中Y是任意大小的符号变量。

但是,在您的示例中,TnwToc数组的维度不会随着您所声明的每次迭代而增长。增长的是Tnw的每个元素中字符串的长度。我认为这可能是你真正要求的,我不认为这是你可以预先分配的东西。你必须把它留给象征引擎。

最后,您似乎不必使用符号函数(symfun)而不是Toc的通用符号数组。这两行是相同的:

Toc = [(1-c)*z c-c*z ; -c+c*z (1+c)*z];
f = collect(Toc);