无论如何使用循环索引在Matlab中调用符号变量?例如,请考虑以下代码,其目标是将符号表达式“x1 + x2 + x3”存储在“y”中。
syms x1 x2 x3
y = 0;
for i = 1:3
y = y + xi;
end
代码不起作用,因为在每次迭代时,Matlab读取“y = y + xi”并返回错误“xi is undefined”,而不是读取“y = y + x1”,“y = y + x2”并且“y = y + x3”,无论如何都在这附近?
感谢。
答案 0 :(得分:3)
我建议你这样做,前提是你可以稍微改变一下编号的符号变量:
x = sym('x',[1 3]); % or: syms x1 x2 x3; x = [x1 x2 x3];
y = x(1);
for i = 2:numel(x)
y = y+x(i);
end
当然在这个简单的例子中,整个for
循环和其他所有内容都可以替换为:
y = sum(sym('x',[1 3]));
有关详细信息,请参阅sym
上的文档。
编辑:请注意,正如@ pm89指出的那样,通过分配1乘3的符号向量x
,您当然无法直接访问符号变量您的工作区中有x1
,x2
和x3
,但必须如图所示对其进行索引。这类似于使用数组或单元格,并且具有许多与我的第二个矢量化示例相同的好处。
答案 1 :(得分:1)
如果您的 Matlab 不直接支持符号的矩阵声明(如sym('x',[3 1])
),您可以为此编写自己的函数:
function out = Matrix_Sym(name, size) %#ok<STOUT>
rows = size(1);
cols = size(2);
S = '';
for k1 = 1:rows
for k2 = 1:cols
if rows == 1
S = [S name int2str(k2) ' '];
elseif cols == 1
S = [S name int2str(k1) ' '];
else
S = [S name int2str(k1) int2str(k2) ' '];
end
end
end
eval(['syms ' S]);
eval (['out = reshape([' S '], [rows, cols]);']);
然后你可以得到相同的结果:
x = Matrix_Sym('x', [3 1])
...