如何在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
那么在大型符号操作中用于预分配的最佳实践是什么?
提前致谢
答案 0 :(得分:2)
首先,zeros(0,50)
不会分配任何东西。这不是一个空的载体。它也是double类型的向量,这就是当您尝试在其中存储符号值时出现错误的原因。我不确定“最佳实践”,但这是我分配符号数组的方式。
Toc = sym(zeros(1,50));
分配双数组,然后重新编号为符号。 UPDATE :在较新版本的Matlab中,您可以使用zeros(1,50,'sym')
或zeros(1,50,'like',Y)
,其中Y
是任意大小的符号变量。
但是,在您的示例中,Tnw
和Toc
数组的维度不会随着您所声明的每次迭代而增长。增长的是Tnw
的每个元素中字符串的长度。我认为这可能是你真正要求的,我不认为这是你可以预先分配的东西。你必须把它留给象征引擎。
最后,您似乎不必使用符号函数(symfun
)而不是Toc
的通用符号数组。这两行是相同的:
Toc = [(1-c)*z c-c*z ; -c+c*z (1+c)*z];
f = collect(Toc);