Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab:创建符号向量_Matlab_Symbolic Math - Fatal编程技术网

matlab:创建符号向量

matlab:创建符号向量,matlab,symbolic-math,Matlab,Symbolic Math,我正在尝试使用matlab中的符号工具箱创建一个函数。 我在创建符号向量(不是符号变量向量)时遇到了麻烦。 你们知道一种不用在路径中创建和编辑类似matlab函数文件的文本的方法吗 *在创建符号变量和所有变量之后,我使用“matlabFunction”创建并保存函数 例如: 功能: function f=test1(x,a) { f=x(1)/a(1)+x(2)/a(2); } 代码: 问题是上面看到的代码创建了一个带有输入参数集(x1,x2,a1,a2)而不是(x,a)的函数,我

我正在尝试使用matlab中的符号工具箱创建一个函数。 我在创建符号向量(不是符号变量向量)时遇到了麻烦。 你们知道一种不用在路径中创建和编辑类似matlab函数文件的文本的方法吗

  • *在创建符号变量和所有变量之后,我使用“matlabFunction”创建并保存函数
例如:

功能:

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

  • 问题是上面看到的代码创建了一个带有输入参数集(x1,x2,a1,a2)而不是(x,a)的函数,我不能更改输入参数的形式,它必须是统一的
  • 实际上,我正在尝试编写一个函数,它将创建一个指定次数的多项式,并将其保存到路径中,这样我就可以使用“eval”(它不支持polyval),但它可能会有更多用处
试试:

>> 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)”。这些将是您必须编写的函数的输入。。在创建这些符号变量并使用它们创建一个使用“matlabFunction”的函数后,您可以进一步准确地解释您正在做什么。它将创建的函数将有4个输入参数(x1、x2、a1、a2),而不是(x、a),它将向量x和a中的每个单元格视为一个单独的变量,它不会根据需要除去2个向量,而是4个参数。@Avico:啊,现在我明白了,你最初没有提到
matlabFunction
。你能把你转换成函数句柄的确切表达式贴出来吗?我想我们可以用一些正则表达式来修复它…@Avico:试试这个:
fh=matlabFunction(r,'file','test1','vars',{a,x})
(如果你愿意,你可以颠倒顺序)。这告诉MATLAB使用向量作为输入
>> f
f = 
    @(a,x)x(1)./a(1)+x(2)./a(2)