无论如何在Matlab中使用循环索引来调用符号变量?例如,考虑以下代码,其目标是将符号表达式“x1+x2+x3”存储在“y”中。
syms x1 x2 x3
y = 0;
for i = 1:3
y = y + xi;
end
代码不起作用,因为在每次迭代中,Matlab 读取“y = y + xi”并返回错误“xi 未定义”,而不是读取“y = y + x1”、“y = y + x2”和“y = y + x3",这附近还有吗?
谢谢。
无论如何在Matlab中使用循环索引来调用符号变量?例如,考虑以下代码,其目标是将符号表达式“x1+x2+x3”存储在“y”中。
syms x1 x2 x3
y = 0;
for i = 1:3
y = y + xi;
end
代码不起作用,因为在每次迭代中,Matlab 读取“y = y + xi”并返回错误“xi 未定义”,而不是读取“y = y + x1”、“y = y + x2”和“y = y + x3",这附近还有吗?
谢谢。
我建议这样做,前提是您可以稍微不同地创建编号符号变量:
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
,但必须如图所示对它们进行索引. 这类似于使用数组或单元格,并且具有许多与我的第二个矢量化示例说明的相同的好处。
如果您的Matlab不直接支持符号的矩阵声明(as 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])
...