在数组中的每个元素之间使用MATLAB linspace

时间:2014-05-07 18:02:51

标签: matlab linear-interpolation

使用MATLAB,我想在数组中的每个点之间进行线性插值。

使用interpolate将以非线性方式执行此操作。我想要做的是产生低通滤波器系数。

我提出了一个解决方案,但我想避免使用for循环:

a=[0 0 1 0 0]; %Input matrix
N=5; %Number of points to be added
b=[];
for i=1:length(a)-1
    b=[b linspace(a(i),a(i+1),N)];
end

没有循环可以做到这一点吗?

1 个答案:

答案 0 :(得分:3)

您可以使用a中的点作为控制点创建线性样条线。之后,您可以根据需要从开始间隔到结束间隔指定任意多个点。正如Raab70所说,你可以使用interp1。可以通过以下方式调用interp1(使用linear插值):

out = interp1(x, y, xp, 'linear')

xx值,y是控制点的y值。 xp是您要评估函数的点。由于您没有明确拥有x值且只需要y值,因此您可以创建一个从1到L的虚拟向量,其中L是如何输出数据中有很多点。此虚拟向量适用于x值。之后,指定y作为输出数据。在这种情况下,它是a的数组。接下来,您需要指定要沿曲线采样的位置。因为你想在每个空间之间引入5个点,你总共会得到5 * 4 + 5 = 25个点。每个“槽”5个点,共有4个槽。您还包括原始输出数据中的5个点。要创建这25个点,只需从1到5执行linspace,并指定在此间隔之间需要25个点。这应该完美地捕获控制点(1,2,3,4,5的虚拟值)以及要用于在每个控制点之间进行插值的值。

因此,尝试这样的事情:

N = 5; %// Number of points to introduce in between each control point
y = [0 0 1 0 0]; %// Your output data
L = numel(y); %// Size of output data. Cache so we don't have to keep typing in numel(y)
x = 1:L; %// Dummy vector
xp = linspace(1, L, N*(L-1) + N); %// Create points to interpolate. N*(L-1) + N is also just N*L
out = interp1(x, y, xp, 'linear'); %// Generate interpolated array

out因此给了我:

out =

Columns 1 through 9

     0         0         0         0         0         0         0    0.1667    0.3333

Columns 10 through 18

0.5000    0.6667    0.8333    1.0000    0.8333    0.6667    0.5000    0.3333    0.1667

Columns 19 through 25

     0         0         0         0         0         0         0