将Matlab上的函数句柄附加到整数表达式

时间:2017-02-08 16:33:46

标签: matlab math mathematical-expressions

我有一个积分表达式,我在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)也不够。

2 个答案:

答案 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