2

我正在尝试在间隔(0,3)上绘制一些支持的凹凸函数。我已经分段定义了函数,使其在区间外为零。这是功能:

function d = bump2(t)  
         region1 = (t > 0) & (t < 3);
         d(region1) = exp(1./(t(region1).^2 - 3*t(region1)));

         region2 = (t <= 0) & (t >= 3);
         d(region2) = 0;
end

如果我设置x = -1:.01:4并尝试运行,plot(x,bump2(x))我会收到一条错误消息,告诉我我的向量长度不同。这确实是正确的,因为length(x) = 501length(bump2(x)) = 400 但是,当我设置 时x = .01:.01:2.99,一切检查正常并且向量的长度相等。

另外,奇怪的是,我还有另一个类似的功能

function b = bump(t)
         region1 = abs(t) < 1;
         b(region1) = exp(-1./(1 - ((t(region1)).^2)));

         region2 = abs(t) >= 1;
         b(region2) = 0;
end

我从来没有遇到过这个问题。为什么这两个功能不同?为什么当我排除点 0 和 3 时第一个函数会起作用,即使我已经定义了函数以避免那里可能出现的奇点?

4

1 回答 1

2

这是因为 b(region1) 正在修剪向量的末端,x因此它的大小不同。

考虑是否设置x = -1:3然后运行代码 plot(x, bump3(x));

function d = bump3 (t)
    region1 = (t > 0) & (t < 3);
    d(region1) = t(region1);
end

然后你会遇到同样的问题。问题是在bump3里面你有

K>> region1

region1 =

     0     0     1     1     0

现在这是诀窍。这个 region1 是数据类型logical,所以 MATLAB 解释下一行

 d(region1) = t(region1);

作为

d(find(region1)) = t(find(region1));

但是如果你写

d = [];
d(5) = 1;

然后你会在零处得到一堆零,所以你在这里做。

您可能会考虑修改为d = t(region1);只获取好的值,但是您仍然遇到大小问题。一种解决方案是将您与新值一起使用的索引作为附加返回值返回,如下所示:

执行:

x = -1:3;
[y region1] = bump4(x);
plot(x(region1), y);

像这样修改凹凸功能的地方:

function [d region1] = bump4 (t)
    region1 = (t > 0) & (t < 3);
    d = t(region1);
end

编辑:

如果您确实想要左右两侧的额外零,您还可以通过d在代码中使用它之前进行初始化来解决此问题,如下所示:

function d = bump2(t)  
         region1 = (t > 0) & (t < 3);
         d = zeros(size(t));
         d(region1) = exp(1./(t(region1).^2 - 3*t(region1)));

         region2 = (t <= 0) & (t >= 3);
         d(region2) = 0;
end

因为我设置了 d = zeros(...) 那么你在区域之外有零,在它里面有你的凹凸函数。另一种看待问题的方法是,MATLAB 在左侧填充而不在右侧填充,因为您从未在那里设置空白值。这通过告诉 MATLAB d 应该有多大来解决这个问题。

于 2013-10-02T17:50:32.487 回答