我有一个积分表达式,我在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)
也不够。
答案 0 :(得分:2)
对不起,我还没有发表评论。但这有用吗?
funcHand= @(t) integral(g,0,t);
您不必在上面的代码中定义x,因为integral
的输入是函数句柄。
然后检查一下:
f2 = zeros(size(t));
for i = 1:length(t)
f2(i) = funcHand(t(i));
end
哎呀,另一个答案说了上面的所有内容(刚用arrayfun替换了for循环。在写答案时我没有看到它。
修改强>
如果你想要内置for循环,请尝试:
funcHand= @(t) arrayfun(@(u) integral(g, 0, u),t);
并测试:
plot(funcHand(t))
答案 1 :(得分:1)
尝试
g
u
中额外的间接水平似乎是多余的。请注意,我已调用输入f
。请记住,f(t)
不会接受向量作为输入。因此,在当前工作空间中执行o = arrayfun(f, t)
之类的操作不会创建与for循环相同的数组。您将不得不遍历数组。便利功能Java client将为您完成此任务:
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)
为了避免不必要的函数句柄的扩散,你可以做到
str = r'xyzA*12*pqR*stB*HS*lmN*opA*45*a4N*gB*SD*drtU*ghy'
result = ""
start = 0
while (str.find("A*", start) > -1):
aStart = str.find("A*", start)+2
aEnd = str.find("*", aStart)
bStart = str.find("B*", aEnd)+2
bEnd = str.find("*", bStart)
result += str[start:aStart]+str[bStart:bEnd]+str[aEnd:bStart]+str[aStart:aEnd]
start = bEnd
result += str[start:]
print result
#xyzA*HS*pqR*stB*12*lmN*opA*SD*a4N*gB*45*drtU*ghy