Matlab:在简单情况下无法使用 subs() 简化符号标量函数

Matlab: can not simplify a symbolic scalar function use subs() in a simple case

这只是matlab中的一个简单案例,函数subs()发生了一些奇怪的事情,我不知道为什么。

我已经阅读了官方帮助文档并搜索了错误消息,但没有找到有用的信息。

有人可以告诉我命令 "subs(f)" 有什么问题吗?

>> syms x w b f
>> f=x*w-b
f =
w*x - b
>> w=[1 2 3 ;4 5 6; 7 8 9 ]
w =
     1     2     3
     4     5     6
     7     8     9
>> x=[1 2 3.44]'
x =
    1.0000
    2.0000
    3.4400
>> b=[ 2 4 7 ]'
b =
     2
     4
     7
>> f
f =
w*x - b
>> subs(f)
Error using symengine
New arrays must have the same dimensions or must be scalars.
Error in sym/subs>mupadsubs (line 140)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);
Error in sym/subs (line 125)
    G = mupadsubs(F,X,Y); 

这是错误消息的屏幕截图:

Symbolic Toolbox 从 Symbolic Variables 是标量的角度进行操作,并且存在它们的任何操作或表达式都使用逐元素语义。正如 subs documentation 中所述:

If old is a scalar, and new is a vector or matrix, then subs(s,old,new) replaces all instances of old in s with new, performing all operations elementwise. All constant terms in s are replaced with the constant times a vector or matrix of all 1s.

因此,进行替换的表达式需要很好地处理元素级应用程序和替换后的扩展。然而,当被替换的新数组在每个维度上都没有匹配大小(这里的系数矩阵是矩形而不是列向量的情况),引擎中很可能会出现维度不匹配。即使直接指定元胞数组替换也会引发错误:

>> wnum = [1 2 3 ;4 5 6; 7 8 9 ];
>> xnum = [1 2 3.44]';
>> bnum = [ 2 4 7 ]';
>> subs(f,{w,x,b},{wnum,xnum,bnum})
Error using symengine
New arrays must have the same dimensions or must be scalars.

Error in sym/subs>mupadsubs (line 140)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);

Error in sym/subs (line 125)
    G = mupadsubs(F,X,Y);

虽然完全符合维度的替换也能正常工作:

>> subs(f,{w,x,b},{xnum,xnum,xnum}); % All 3x1
>> subs(f,{w,x,b},{wnum,wnum,wnum}); % All 3x3

所有这一切都源于符号变量本身被视为标量。符号变通方法是将变量声明为符号数组以生成数组的各个元素并允许一对一替换:

>> w = sym('w',[3,3]);
>> x = sym('x',[3,1]);
>> b = sym('b',[3,1]);
>> f = w*x - b;
>> subs(f,[w,x,b],[wnum,xnum,bnum])

ans =

  333/25
  766/25
 1174/25

当然,如果可以的话,最好的做法是完全或尽可能避免使用符号工具箱。

>> double(subs(f,[w,x,b],[wnum,xnum,bnum]))
ans =
   13.3200
   30.6400
   46.9600

>> fnum = wnum*xnum - bnum
fnum =
   13.3200
   30.6400
   46.9600

除了与之相关的所有性能提升之外,上述讨论是我将线性代数留给 MATLAB 的一个非常非常重要的原因 运行-time proper。在我看来,符号工具箱最好留给一个或多个变量的函数分析(我经常用它来创建泰勒级数、雅可比矩阵和 Hessian 矩阵)或用于调查目的的小维度问题的高精度分析。