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

Matlab 添加递归函数句柄并在打印后查看正确输出的正确方法是什么?

Matlab 添加递归函数句柄并在打印后查看正确输出的正确方法是什么?,matlab,Matlab,这就是我所尝试的: f = @(x) 0; for i = 1:n f = @(x) f(x) + x^i; end 当我通过输入一些值来测试它时,它似乎做了正确的事情 但是当打印f时,我得到了这个输出f=@(x)f(x)+x^I 编辑:那么如何获得我想要看到的输出,在函数句柄中所有summand的位置,当我打印f时,您不需要for循环,请使用sum f =@(x,n) sum(x.^(1:n)); 编辑: 我误读了OP的帖子,认为他想要的是sum(x^I)。I重新创建其行为并对x中

这就是我所尝试的:

f = @(x) 0;
for i = 1:n
    f = @(x) f(x) + x^i;
end
当我通过输入一些值来测试它时,它似乎做了正确的事情

但是当打印
f
时,我得到了这个输出
f=@(x)f(x)+x^I


编辑:那么如何获得我想要看到的输出,在函数句柄中所有summand的位置,当我打印
f
时,您不需要for循环,请使用
sum

f =@(x,n) sum(x.^(1:n));
编辑:

我误读了OP的帖子,认为他想要的是
sum(x^I)
。I重新创建其行为并对
x
中任意数量的维度有效的新函数是

g = @(x,n) sum(reshape(repmat(x(:), 1, n).^repmat(n, numel(x), n), horzcat(size(x), n)), length(size(x)) + 1);

您可以使用符号函数(
symfun
)执行所需操作:

% create symbolic variable
syms x

% define order of polynom
n = 3;

% create polynom
fs(x) = 0*x;
for i = 1:n
    fs(x) = fs(x) + x.^i;
end

% convert symbolic function to function handle
f = matlabFunction(fs)
结果:

f = 
    @(x)x+x.^2+x.^3
f = 
    @(x)0+x.^1+x.^2+x.^3
编辑:以下是一种不使用符号数学工具箱的方法:

% define order of polynom
n = 3;

% create polynom as string
fstring = '0';
for i = 1:n
    fstring = [fstring, '+x.^',num2str(i)];
end

f = str2func(['@(x)',fstring]);
结果:

f = 
    @(x)x+x.^2+x.^3
f = 
    @(x)0+x.^1+x.^2+x.^3

你到底想做什么?您的函数相当于
@(x)n*x^n
(非递归)。为什么是递归?你试过结果函数了吗?我做了一个快速测试(在用
^
替换
^
之后),它似乎产生了一些更高阶的多项式,正如预期的那样。你可能会对一个打印问题感到惊讶,但不要指望它神奇地做符号数学…有趣的是
info=functions(f);info.workspace{1}
只给出了
f:@(x) f(x)+x^n
n:5
。因此它没有给出函数
f
实际在做什么的线索。似乎
函数
没有告诉函数
f
携带的所有信息。特别是,它告诉函数使用的变量的值,但如果这个函数句柄恰好就是它本身!那么你无论如何都需要改变你的原始代码,因为你在循环的每个阶段都有x^n,而且
n
没有改变。但是无论哪种方式,你都不会得到漂亮的东西。你想要打印出漂亮的东西,计算出正确答案的东西,还是两者兼而有之必须在任何作为函数句柄的工作区字段上不断调用
函数
,直到到达底部。这不会产生与OP函数相同的结果,但它会产生相同的结果。现在它会产生与OP相同的结果。因此仅使用函数句柄是没有办法的?不,因为
函数句柄
i它只是一个句柄,而不是函数本身。执行
f=@(x)0;f=@(x)f(x)+x^1;f=@(x)f(x)+x^2;
将返回最后一行。这正是您告诉Matlab要做的。它会创建一个函数句柄到一个函数句柄,再加上一些附加函数。编辑:您只能通过将函数句柄放入函数句柄数组中并将每个句柄引用到上一个条目来使用函数句柄。但这不会生成您一个很好的输出,并不是一个很好的方法。刚才提到给你的问题一个100%的答案;-)@马特:可能有一种方法可以使用函数的“工作空间”字段来实现这一点,但在任何变量的值中建立层次结构和pul可能会相当繁琐。符号方法在这里可能最简单。@horchler此工作空间只是函数的变量所在的位置(此处:
i
)在for循环期间的OP示例中,
info=functions(f);info.workspace{1}的值.i
在每次迭代中都会发生更改。这仍然会导致问题,即必须将每次迭代的函数句柄保存在某个位置。否则该值只是被覆盖。@Matt:不,它没有被覆盖。这是闭包在Matlab中的工作方式。您可以按照我提到的层次结构来查看
f和
i
。尝试类似的方法:
info=functions(f);
info2=functions(info.workspace{1}.f);
info2.workspace{1}.i
单调乏味,正如我所说,但可能。