У меня есть матрица 20x23 в Matlab, 4 угла которой имеют значение:
(1,1) = 16.46
(1,23) = 16.16
(20,1) = 16.93
(20,23) = 16.57
Как я могу интерполировать эти значения по всему домену 20x23?
Спасибо!
В этом примере я использовал 'linear' интерполяцию. Ниже я ссылаюсь на матрицу как на точки выборки, где я определяю углы матрицы как координаты (1,1), (1,2), (2,1) и (2,2). Чтобы интерполировать значения Matrix, необходимо создать два вектора для определения точек запроса. Это действует как более мелкая сетка (пространственная область), которая сообщает функции interp2() точки (между ними) для интерполяции. Это, конечно, встроенный подход, и есть альтернативные методы.
Некоторые методы интерполяции, доступные для interp2(): 'linear', 'nearest', 'cubic', 'spline', 'makima'
Matrix(1,1) = 16.46; %Top-left corner%
Matrix(1,2) = 16.16; %Top-right corner%
Matrix(2,1) = 16.93; %Bottom-left corner%
Matrix(2,2) = 16.57; %Bottom-right corner%
Width = 23;
Height = 20;
Finer_X_Points = linspace(1,2,Width);
Finer_Y_Points = linspace(1,2,Height)';
Finer_Matrix = interp2(Matrix,Finer_X_Points,Finer_Y_Points,'linear');
pcolor(flip(Finer_Matrix,1));
title("Interpolated Matrix");
colorbar
axis off
Выполнено с использованием MATLAB R2019b
Вы в основном делаете одну ячейку билинейной интерполяции .
Итак, по ссылке нужная формула
Вы могли бы использовать interp2, но чтобы отличаться от ответа Майкла, мы могли бы просто реализовать это сами...
% Setup
x = [1, 23];
y = [1, 20];
z = [16.46, 16.93;
16.16, 16.57];
% Interpolation function
biLinearInterp = @(xi,yi) ( 1/( (x(2)-x(1))*(y(2)-y(1)) ) ) * ...
[x(2)-xi, xi-x(1)] * z * [y(2)-yi; yi-y(1)];
% Create data
[X, Y] = meshgrid( x(1):x(2), y(1):y(2) );
Z = arrayfun( @(xi,yi) biLinearInterp(xi,yi), X, Y );
Это соответствует вашей оригинальной спецификации, которая
Z(1,1) = 16.46
Z(1,23) = 16.16
Z(20,1) = 16.93
Z(20,23) = 16.57
С линейной интерполяцией между
Попробуйте интерп2