假设我们有以下数据:
A1= [41.3251
18.2350
9.9891
36.1722
50.8702
32.1519
44.6284
60.0892
58.1297
34.7482
34.6447
6.7361
1.2960
1.9778
2.0422];
A2=[86.3924
86.4882
86.1717
85.8506
85.8634
86.1267
86.4304
86.6406
86.5022
86.1384
86.5500
86.2765
86.7044
86.8075
86.9007];
当我使用plot(A1,A2);
绘制上述数据时,我得到了这个图:
有没有办法让图形像立方图一样平滑?
答案 0 :(得分:3)
是的,你可以。您可以在关键点之间进行插值。这需要一些技巧。盲目地使用任何MATLAB命令进行插值都不会起作用,因为它们需要增加独立轴(x
- 轴)。您目前无法对您的数据执行此操作...至少开箱即用。因此,您必须创建一个虚拟的值列表,其范围从1到A1
(或A2
中的N
,因为它们的大小相等创建一个独立的轴并通过指定分辨率更精细间距的虚拟列表来独立插入两个数组。这个更精细的间距由您想要在图中引入的新点的总数控制。这些点将在虚拟列表的范围内定义,但每个点之间的间距将随着您增加新点的总数而减少。作为一般规则,你添加的点越多,所以间距就越小,因此绘图应该更加平滑。完成后,将最终值绘制在一起。
这里有一些代码供您运行。我们将使用interp1
为我们和大部分工作执行插值。函数linspace
在虚拟列表中创建更精细的点网格以便于插值。 pchip
将是您想要绘制的所需点的总数。我现在已经将其设为500,这意味着使用原始数据将使用500点进行插值。通过增加(或减少)总点数并查看其对数据平滑度的影响进行试验。
我还将使用Piecewise Cubic Hermite Interpolating Polynomial或A1
作为插值方法,如果您想获得技术,则基本上是三次样条插值。假设已经创建了A2
和%// Specify number of interpolating points
N = 500;
%// Specify dummy list of points
D = 1 : numel(A1);
%// Generate finer grid of points
NN = linspace(1, numel(A1), N);
%// Interpolate each set of points independently
A1interp = interp1(D, A1, NN, 'pchip');
A2interp = interp1(D, A2, NN, 'pchip');
%// Plot the data
plot(A1interp, A2interp);
:
Trait method callMe has not been applied, because there are collisions with other trait methods on Src\Classes\A in
C:\wamp\www\src\classes\a.php on line 72
我现在得到以下内容: