2016-06-28 4 views
0

Так что я сейчас работаю над заполнением 2-D матрицы, чтобы откалибровать картинку, которую я взял.Matlab, Interpolate данные между двумя векторами

Для этого я создал:

vector1 = linspace(0.037, 0.03175, 256); 

Этот вектор в идеале первая строка в матрице.

Я тогда еще один вектор:

vector2 = linspace(0.0288, 0.0277, 256); 

мне было интересно, если есть способ интерполировать между vector1 и vector2 и они будут вставлены в матрицу с Row 1 = vector1 и Row 168 = vector2.

У меня должно быть 168 рядов с 256 столбцами.

Любая помощь была бы принята с благодарностью.

Я бы предпочел не делать 168 строк вручную ....

ответ

2

Если вы хотите простой линейной интерполяции между этими двумя, вы можете применить вес к каждому из векторов V1 и V2 и добавить их вместе , Наверху V1 будет взвешен 1 и V2 должен быть взвешен 0. Аналогично внизу, V2 следует взвешивать на 1 и V1 следует взвешивать по 0. Каждый раз, когда весы должны быть добавлены к 1 и будут весовыми V1 и V2 в зависимости от того, насколько близко верхний или нижний.

V3 = alpha * V1 + (1 - alpha) * V2; 

Мы можем использовать умножение матриц для создания нагруженных версии V1 и V2, а затем добавить результат вместе, чтобы получить V3.

nRows = 168; 

alpha = linspace(1, 0, nRows); 
V3 = alpha(:) * V1 + (1 - alpha(:)) * V2; 
2

вы можете просто использовать interp1 следующим образом:

m = interp1([1 2],[vector1;vector2],linspace(1,2,168)) 
+0

Удивительный! Работала безупречно. Спасибо – user2852630

+0

, то пожалуйста, воздержитесь от \ accept answer ... :) – bla

+0

вы также можете играть с различными методами интерполяции (сплайн, кубик и т. Д.) ... загляните в документацию 'interp1' – bla

1

В то время как для конкретного приложения это, вероятно, излишним, но вы можете использовать griddata для выполнения 2d билинейной интерполяции, используя свои входные точки. Это не обязательно даст тот же результат, как ручной 1d интерполяции данных, хотя в данном конкретном случае я считаю, что результат, вероятно, будет то же самое:

H = 168; 
W = 256; 
vector1 = linspace(0.037,0.03175,W); 
vector2 = linspace(0.0288,0.0277,W); 
[Wmat,Hmat] = meshgrid(1:W,1:H); 
img = griddata([1:W,1:W],[ones(1,W), H*ones(1,W)],[vector1 vector2],Wmat,Hmat,'linear') 

Результат кажется правильным:

>> all(abs(img(1,:)-vector1)<1e-10) 

ans = 

    1 

>> all(abs(img(end,:)-vector2)<1e-10) 

ans = 

    1 
Смежные вопросы