Заслуженный участник |
|
12/07/07 4522
|
Последний раз редактировалось GAA 15.09.2015, 15:40, всего редактировалось 3 раз(а).
Перечитал в свободное время. Если X1, X2, X3 — матрицы, то результатом будет трехмерный массив. Спать по ночам надо. :) Поправлюсь. Если X1, X2, X3 — трехмерные массивы, то результатом будет трехмерный массив. (Аналогично, если X1, X2, X3 — двумерные массивы, то результатом будет двумерный массив. Т.е. размерность результата определяется размерностью массивов задающих сетку.) Функция для иллюстрации идеи интерполяции (двумерная сетка). (Проверка выхода на границу сетки не делается, проверка выхода за границу не делается. Для Matlab код абсурден, поэтому никакие проверки на входе процедуры не делаются. Короче, это идея для перевода на C. Не стал загромождать код. Все проверки имеет смысл писать уже в коде на C.)
function A = MyInterp3(B, X, Y, Z)
[m, n] = size(X)
for i=1:m
for j=1:n
A(i, j) = f(B, X(i, j), Y(i, j), Z(i, j));
end
end
function C = f(B, x1, x2, x3)
j1 = floor(x1); j2 = floor(x2); j3 = floor(x3);
Delta1 = x1 - j1; Delta2 = x2 - j2; Delta3 = x3 - j3;
C11 = ( B(j1, j2, j3)*(1-Delta1) + B(j1+1, j2, j3)*Delta1 ) * ( 1 - Delta2 );
C12 = (B(j1, j2+1, j3)*(1-Delta1) + B(j1+1, j2+1, j3)*Delta1) * Delta2;
C21 = (B(j1, j2, j3+1)*(1-Delta1) + B(j1+1, j2, j3+1)*Delta1 ) * ( 1 - Delta2 );
C22 = (B(j1, j2+1, j3+1)*(1-Delta1) + B(j1+1, j2+1, j3+1 )*Delta1 ) * Delta2;
C = (C11 + C12) * (1-Delta3) + (C21 + C22) * Delta3;
Скрипт для тестирования. :) B(1,1,1) = 0; B(1, 2, 1) = 1; B(2, 1, 1) = 1; B(2, 2, 1) = 2;
B(1,1,2) = 0; B(1, 2, 2) = 1; B(2, 1, 2) = 1; B(2, 2, 2) = 2;
X = [1.1 1.8; 1.2 1.9]; Y=[1.05 1.095; 1.5 1.55]; Z = [1.01 1.15; 1.25 1.35];
format long
A1 = MyInterp3(B, X, Y, Z);
A2 = interpn(B, X, Y, Z);
Err = A1 - A2 Если запустить, то получим совпадение, в пределах погрешности операций с Double. Прим. Значения элементов матриц взяты произвольные, лишь бы внутри сетки находились. (Если массивы, задающие сетку, будут трехмерные, то можно нарисовать тройной цикл.)
|
|