Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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 Computation - Fatal编程技术网

使用符号matlab实现灵活的参数和函数数量

使用符号matlab实现灵活的参数和函数数量,matlab,symbolic-computation,Matlab,Symbolic Computation,我有一个函数F,它把向量a作为输入。函数的输出和a都是长度为N的向量,其中N是任意的。每个组件Fn的形式为g(a(n),a(n-k)),其中g对于每个组件是相同的 我想用它的符号功能在matlab中实现这个函数,并计算它的雅可比矩阵(然后用matlabFunction将函数及其雅可比矩阵存储为一个常规的.m文件)。我知道如何对每个输入都是可以手动处理的标量的函数执行此操作。但在这里,我想要一个脚本,能够为任何N生成这些文件。有没有一个好的方法来做到这一点 我提出的一个解决方案是生成一个字符串数组

我有一个函数F,它把向量a作为输入。函数的输出和a都是长度为N的向量,其中N是任意的。每个组件Fn的形式为g(a(n),a(n-k)),其中g对于每个组件是相同的

我想用它的符号功能在matlab中实现这个函数,并计算它的雅可比矩阵(然后用
matlabFunction
将函数及其雅可比矩阵存储为一个常规的.m文件)。我知道如何对每个输入都是可以手动处理的标量的函数执行此操作。但在这里,我想要一个脚本,能够为任何N生成这些文件。有没有一个好的方法来做到这一点

我提出的一个解决方案是生成一个字符串数组“a0”、“a1”、“an”,并使用
eval
定义输出的每个组件。但这很混乱,我想知道是否有更好的方法

谢谢大家!

[编辑]

以下是我当前解决方案的一个最简单的工作示例:

function F = F_symbolically(N)

%generate symbols
for n = 1:N
    syms(['a',num2str(n)]); 
end

%define output
F(1) = a1;
for n = 2:N
    F(n) = eval(sprintf('a%i + a%i',n,n-1));
end
试试这个:

function F = F_symbolically(N)
    a = sym('a',[1 N]);
    F = a(1);
    for i=2:N
        F(i) = a(i) + a(i-1);
    end
end
请注意使用
sym
函数(而不是
syms
)创建符号变量数组。

尝试以下操作:

function F = F_symbolically(N)
    a = sym('a',[1 N]);
    F = a(1);
    for i=2:N
        F(i) = a(i) + a(i-1);
    end
end

请注意使用
sym
函数(而不是
syms
)创建符号变量数组。

请在您的问题中加入一些示例代码来演示您的问题,可以是固定数量参数的版本,也可以是您的
eval
解决方案。我确信它可以做得更好,但我不知道我是否需要解释逗号分隔列表,符号工具箱如何处理向量,或者两者兼而有之。这很糟糕。MATLAB有几种非常适合此任务的数据容器格式,如结构。您是否知道语法:
a=sym('a',[1 N])
,然后可以作为
a(i)
访问?谢谢您的回复@丹尼尔,我添加了一个最小的工作示例。阿德里安,我完全同意,因此我的问题;)你链接的问题确实很有趣,但我没有发现任何关于符号功能的东西。你有没有关于如何在没有
eval
的情况下完成上述工作的示例?@Amro没有,我不是:P这就成功了!非常感谢。请在您的问题中加入一些示例代码来演示您的问题,可以是固定数量参数的版本,也可以是您的
eval
解决方案。我确信它可以做得更好,但我不知道我是否需要解释逗号分隔列表,符号工具箱如何处理向量,或者两者兼而有之。这很糟糕。MATLAB有几种非常适合此任务的数据容器格式,如结构。您是否知道语法:
a=sym('a',[1 N])
,然后可以作为
a(i)
访问?谢谢您的回复@丹尼尔,我添加了一个最小的工作示例。阿德里安,我完全同意,因此我的问题;)你链接的问题确实很有趣,但我没有发现任何关于符号功能的东西。你有没有关于如何在没有
eval
的情况下完成上述工作的示例?@Amro没有,我不是:P这就成功了!非常感谢。不确定OP示例的代表性如何,但函数体可以替换为
F=cumsum(sym('a',[1n])。不完全是这样,上面的函数只是计算当前项和以前项的总和,而不是从一开始就累加计算。。无论如何,向量化并不是这里的主要关注点,我相信我们可以用类似于F=[a(1),a(1:end-1)+a(2:end)]的东西来实现,不确定OP的例子有多具有代表性,但是函数体可以被
F=cumsum(sym('a',[1n])代替。不完全是这样,上面的函数只是计算当前项和以前项的总和,而不是从一开始就累加计算。。无论如何,矢量化不是这里的主要关注点,我相信我们可以用F=[a(1),a(1:end-1)+a(2:end)]