Matlab: 创建一个符号向量

6
我是一个有用的助手,可以为您翻译以下内容。这是关于编程的中文文章。

我正在尝试使用matlab中的符号工具箱创建一个函数。 我一直在尝试创建一个符号向量(而不是符号变量的向量)。 你们知道如何做到这一点吗?而不必在路径中创建和编辑类似文本的matlab函数文件。

  • *在创建符号变量和所有其他内容后,我使用'matlabFunction'创建并保存函数。

举个例子:

函数:

function f=test1(x,a) {
   f=x(1)/a(1)+x(2)/a(2);
}

代码:

a = sym('a', [1 2]);
x = sym('x', [1 2]);
% f(x, a) = sym('f(x, a)');
r=x(1)/a(1)+x(2)/a(2);
% f(x,a)=r;
% handle=matlabFunction(f(x,a),'file','test1');
handle=matlabFunction(r,'file','test1');

问题在于上面看到的代码创建了一个带有输入参数集合(x1, x2, a1, a2)的函数,而不是(x,a),我无法更改输入参数的形式,它必须是统一的。 实际上,我正在尝试编写一个函数,它将创建指定次数的多项式并将其保存到路径中,以便我可以使用'eval'进行计算(不支持polyval),但它可能会更有用。
1个回答

7

尝试:

>> x = sym('x',[1 2])
x =
[ x1, x2]

>> x(1)
ans =
x1

>> x(2)
ans =
x2

>> whos x
  Name      Size            Bytes  Class    Attributes

  x         1x2               112  sym      

这类似于编写以下代码:
>> syms a1 a2
>> a = [a1 a2]

编辑:

首先我们从符号变量中建立一个表达式:

a = sym('a', [1 2]);
x = sym('x', [1 2]);
expr = x(1)/a(1)+x(2)/a(2);

接下来我们将它转换为一个普通的MATLAB函数:

fh = matlabFunction(expr, 'file','test1', 'vars',{a,x});

生成的函数为:
function expr = test1(in1,in2)
    a1 = in1(:,1);
    a2 = in1(:,2);
    x1 = in2(:,1);
    x2 = in2(:,2);
    expr = x1./a1+x2./a2;
end

最初我考虑使用正则表达式来修复生成的函数句柄。这是一种非常不优雅的方法,因此我建议使用之前的方法代替:

% convert to a function handle as string
fh = matlabFunction(expr);
str = char(fh);

% separate the header from the body of the function handle
T = regexp(char(fh), '@\((.*)\)(.*)', 'tokens', 'once');
[args,body] = deal(T{:});

% extract the name of the unique arguments (without the index number)
args = regexp(args, '(\w+)\d+', 'tokens');
args = unique([args{:}], 'stable');

% convert arguments from: x1 into x(1)
r = sprintf('%s|', args{:}); r = r(1:end-1);
body = regexprep(body, ['(' r ')(\d+)'], '$1($2)');

% build the arguments list of the new function: @(a,b,c)
head = sprintf('%s,', args{:}); head = head(1:end-1);

% put things back together to form a function handle
f = str2func(['@(' head ') ' body])

生成的函数句柄:

>> f
f = 
    @(a,x)x(1)./a(1)+x(2)./a(2)

之前尝试过,但不起作用。它创建了一个具有4个输入参数的函数:'test1(x1, x2, a1, a2)',而不是'test1(x, a)'。 - Avico
我不明白,上面的代码并没有创建一个函数,只是定义了一些符号变量。这些变量将成为你需要编写的函数的输入参数。也许你可以进一步解释一下你正在做什么。 - Amro
在创建这些符号变量并使用它们来创建一个使用'matlabFunction'的函数之后,所创建的函数将具有4个输入参数(x1, x2, a1, a2),而不是(x, a)。它会将向量x和a中的每个单元格视为一个独立的变量,并且它将不接受所需的2个向量,而是接受4个参数。 - Avico
@Avico: 哦,我明白了,你一开始没有提到matlabFunction。你能发一下你想转换成函数句柄的确切表达式吗?我在想我们可以通过使用一些正则表达式来修复它... - Amro
@Avico:尝试这个:fh = matlabFunction(r, 'file','test1', 'vars',{a,x})(如果你喜欢,可以反转顺序{x,a})。这告诉MATLAB使用向量作为输入。 - Amro
显示剩余2条评论

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