如何在Matlab中自动调用循环中的符号变量

时间:2013-06-27 17:32:06

标签: matlab symbolic-math

无论如何使用循环索引在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”,无论如何都在这附近?

感谢。

2 个答案:

答案 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,您当然无法直接访问符号变量您的工作区中有x1x2x3,但必须如图所示对其进行索引。这类似于使用数组或单元格,并且具有许多与我的第二个矢量化示例相同的好处。

答案 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])
...