MATLAB符号输出与逐元素运算

3

有没有一种函数或技术可以将MATLAB的符号表达式转换为可以逐元素计算的表达式?

例如,以下命令:

a = solve('x^2 + a*x + b == 0')

输出结果

a = 
   (a^2 - 4*b)^(1/2)/2 - a/2
 - a/2 - (a^2 - 4*b)^(1/2)/2

然而,期望的输出应该允许ab是数组,如下所示:

a = 
   (a.^2 - 4*b).^(1/2)/2 - a/2
 - a/2 - (a.^2 - 4*b).^(1/2)/2
3个回答

6

solve('x^2 + a*x + b == 0') 返回一个2x1的符号解。我理解您想要对各种a和b值进行求解。为了做到这一点,您需要使用matlabFunction将您的符号转换为函数。

s = solve('x^2 + a*x + b == 0');
f = matlabFunction(s);

现在f是一个有两个输入参数a和b的函数。尝试对三个a和b值的两个向量进行操作:

f([1 2 3],[1 1 1])

如果您使用subs函数,您也可以实现您想要的功能:

然后,您将获得一个2x3的解决方案数组。

subs(s,{'a' 'b'},{[1 2 3 ] [1 1 1]})

将 [1 2 3] 替换为a,将 [1 1 1] 替换为b,并返回一个 2x3 的矩阵。如果要对其进行计算,请使用 eval 命令:

eval(subs(s,{'a' 'b'},{[1 2 3 ] [1 1 1]}))

小心!对于大向量来说,这可能非常慢。 - NullPointerException

1
要获得您所需的字符串,存在一个MATLAB函数可以实现此操作。它被称为vectorize
在这里查看更多信息在MATLAB文档中。该函数在s中的任何^、*或/之前插入一个.。结果是一个字符字符串。

0

我相信你有几个操作需要转换。

实际上,你可以用(a.^2 - 4*b).^(1/2)/2 - a./2来替换它

我建议3种不同的解决方案,取决于表达式中有多少不同的变量:

  • 如果你只有不到几十个变量,可能更容易做一个“CTRL-F”(搜索和替换),并在代码中将每个变量“var”替换为它们的等效“var.”。确保勾选“整个单词”。 这应该不到一分钟就能完成。
  • 如果你有不到几十个变量,但表达式分散在几个不同的文件中,你可能想下载notepad++并做同样的事情。Notepadd++添加了在文件夹和子文件夹中搜索和替换的选项。这将节省你很多时间。
  • 如果你有很多不同的变量,你可能需要研究正则表达式,并针对出现在文件中的每个字符串使用搜索和替换的正则表达式。创建一个新的matlab函数,以你需要的方式实现regexprep。

编辑:我刚注意到你需要小心括号。

(a.^2 - 4*b).^(1/2)/2 - a./2 是正确的 (a.^2 - 4*b.).^(1/2)/2 - a./2 是错误的

因此,如果您使用CTRL-F方法,请将末尾的"var.)"替换为"var)"


.* 替换所有的 * 会更容易。 - Daniel
2
有一个叫做vectorize的旧函数,它可以追溯到使用inline的时代,我相信某些符号工具箱代码仍然在幕后使用它。如果您键入edit vectorize,您会发现它几乎只是执行字符串替换(strrep)。不幸的是,它只对标量函数起作用并且返回一个字符串。 - horchler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接