将 Matlab 上的函数句柄附加到积分表达式的问题
Problems attaching a function handle on Matlab to integral expression
我有一个积分表达式,它是我在 Matlab 上使用
定义的
x = 0:1/1000:1;
g = @(x) (exp(-1./x.^2).*heaviside(x)).*(exp(-1./(1-x).^2).*heaviside(1-x));
t = 0:1/1000:1;
f = zeros(size(t));
for i = 1:length(t)
f(i) = integral(g,0,t(i));
end
我可以绘制它,例如,使用 plot(t,f)
,但出于其他目的,我想将函数句柄附加到 f
,即类似 f = @(t) zeros(size(t))
的东西。到目前为止我还没有弄明白。 f = @(t) integral(@(x)g(x),0,t)
也不够。
尝试
f = @(u) integral(g, 0, u)
g
中额外的间接级别似乎是多余的。请注意,我已将输入称为 u
。请记住,f
不会接受向量作为其输入。因此,在当前工作区中执行 f(t)
之类的操作不会创建与 for 循环相同的数组。您将不得不遍历数组。便利函数 arrayfun
将为您完成此操作:
o = arrayfun(f, t)
它大致相当于你现在的循环:
o = zeros(size(t));
for i = 1:length(o)
o(i) = f(t(i));
end
arrayfun
实际上可以合并到您的函数句柄中以允许它处理向量参数:
h = @(t) arrayfun(f, t)
为避免增加不必要的函数句柄,您可以这样做
f = @(t) arrayfun(@(u) integral(g, 0, u), t)
抱歉,我还不能发表评论。但这有用吗?
funcHand= @(t) integral(g,0,t);
您不必在上面的代码中定义 x,因为 integral
的输入是函数句柄。
然后检查是否相同:
f2 = zeros(size(t));
for i = 1:length(t)
f2(i) = funcHand(t(i));
end
哎呀,另一个答案上面都说了(只是把for循环换成了arrayfun,写答案的时候没看到
编辑
如果你想build-in for循环,试试:
funcHand= @(t) arrayfun(@(u) integral(g, 0, u),t);
并测试:
plot(funcHand(t))
我有一个积分表达式,它是我在 Matlab 上使用
定义的x = 0:1/1000:1;
g = @(x) (exp(-1./x.^2).*heaviside(x)).*(exp(-1./(1-x).^2).*heaviside(1-x));
t = 0:1/1000:1;
f = zeros(size(t));
for i = 1:length(t)
f(i) = integral(g,0,t(i));
end
我可以绘制它,例如,使用 plot(t,f)
,但出于其他目的,我想将函数句柄附加到 f
,即类似 f = @(t) zeros(size(t))
的东西。到目前为止我还没有弄明白。 f = @(t) integral(@(x)g(x),0,t)
也不够。
尝试
f = @(u) integral(g, 0, u)
g
中额外的间接级别似乎是多余的。请注意,我已将输入称为 u
。请记住,f
不会接受向量作为其输入。因此,在当前工作区中执行 f(t)
之类的操作不会创建与 for 循环相同的数组。您将不得不遍历数组。便利函数 arrayfun
将为您完成此操作:
o = arrayfun(f, t)
它大致相当于你现在的循环:
o = zeros(size(t));
for i = 1:length(o)
o(i) = f(t(i));
end
arrayfun
实际上可以合并到您的函数句柄中以允许它处理向量参数:
h = @(t) arrayfun(f, t)
为避免增加不必要的函数句柄,您可以这样做
f = @(t) arrayfun(@(u) integral(g, 0, u), t)
抱歉,我还不能发表评论。但这有用吗?
funcHand= @(t) integral(g,0,t);
您不必在上面的代码中定义 x,因为 integral
的输入是函数句柄。
然后检查是否相同:
f2 = zeros(size(t));
for i = 1:length(t)
f2(i) = funcHand(t(i));
end
哎呀,另一个答案上面都说了(只是把for循环换成了arrayfun,写答案的时候没看到
编辑
如果你想build-in for循环,试试:
funcHand= @(t) arrayfun(@(u) integral(g, 0, u),t);
并测试:
plot(funcHand(t))