3

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

ループなしでこれを行うことは可能ですか?

4

1 に答える 1

3

の点を制御点として線形スプラインを作成できます。aその後、開始間隔から終了間隔まで、必要な数のポイントを指定できます。Raab70 が言ったように、 を使用できますinterp1interp1次の方法で呼び出すことができます (linear補間を使用):

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

xx値で、 はコントロール ポイント yの値です。関数を評価するポイントです。明示的に値を持たず、値が必要なだけなので、1 から出力データ内のポイント数までのダミー ベクトルを作成できます。このダミー ベクトルは値用です。その後、出力データとして指定します。この場合、それはの配列ですyxpxyLLxya. 次に、曲線に沿ってサンプリングする場所を指定する必要があります。各スペースの間に 5 つのポイントを導入したいので、合計で 5*4 + 5 = 25 ポイントになります。「スロット」ごとに 5 ポイント、合計 4 つのスロットがあります。元の出力データからの 5 つのポイントも含めます。これらの 25 ポイントを作成するにはlinspace、1 から 5 までを実行し、この間隔の間に 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
于 2014-05-07T18:19:22.790 に答える