【问题标题】:How to call automatically symbolic variables in a loop in Matlab如何在Matlab的循环中自动调用符号变量
【发布时间】:2013-06-27 17:32:05
【问题描述】:

到底有没有使用循环索引在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 symbolic-math


    【解决方案1】:

    我建议这样做,前提是您可以稍微不同地创建编号符号变量:

    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,您当然不能直接访问符号变量 @987654328 @、x2x3 在您的工作区中,但必须如图所示为它们编制索引。这类似于使用数组或单元格,并且具有许多与我的第二个矢量化示例说明的相同的好处。

    【讨论】:

    • +1:在第一种情况下(sym('x',[1 3])),可能值得一提的是,x1 如果单独使用,将是未定义的,必须使用x(1) 访问。
    • +1:但是,假设我不能声明符号数组,那么有什么建议吗?我实际上并没有使用标准的 Matlab 符号对象 - 我正在使用一些表示多项式的自定义符号对象(它们是 this open source toolbox 的一部分,在其文档中几乎没有提到如何处理上述内容)。然而,在大多数情况下(除了能够声明这些符号的数组)对象的行为与普通的 matlab 符号变量一样。
    • @jkn:那么请编辑您的问题。如果您描述的对象不是sym 类,那么我认为在您的示例中询问syms 并使用syms 有点误导。这些自定义对象是字符串吗?他们有关联的eval 函数吗?
    【解决方案2】:

    如果您的 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])
    ...
    

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      相关资源
      最近更新 更多