3

无论如何在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",这附近还有吗?

谢谢。

4

2 回答 2

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,x2x3,但必须如图所示对它们进行索引. 这类似于使用数组或单元格,并且具有许多与我的第二个矢量化示例说明的相同的好处。

于 2013-06-27T17:47:41.287 回答
1

如果您的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])
...
于 2013-06-27T17:59:39.417 回答