Matlab: интерполировать 4 угловых значения по всей матрице

У меня есть матрица 20x23 в Matlab, 4 угла которой имеют значение:

(1,1) = 16.46
(1,23) = 16.16
(20,1) = 16.93
(20,23) = 16.57

Как я могу интерполировать эти значения по всему домену 20x23?

Спасибо!

Попробуйте интерп2

Luis Mendo 18.12.2020 16:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
308
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В этом примере я использовал '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

С линейной интерполяцией между

Другие вопросы по теме