Эффективная манипуляция с массивом ячеек интерполированных сеточных данных в Matlab - PullRequest
0 голосов
/ 06 июня 2018

У меня есть векторы Ll, Lh, x и alp размеров NL, NL, Nx и Nalp соответственно.У меня также есть матрица G размером NL * NL * Nx * Nalp.G является функцией от Ll, Lh, x и alp.Вместе у меня есть сеточные массивы и выборочные значения в G.

Для каждого x и alp я создаю интерполяцию и сохраняю в массиве ячеек.Ниже приведен фрагмент кода:

for ixs=1:Nx
  for ias=1:Nalp
    Gn(:,:,ixs, ias)={griddedInterpolant({Ll, Lh}, G(:,:,ixs, ias),'linear', 'none')};
  end
end

Плюсы: по сравнению с interp2 это очень быстро, особенно потому, что мне приходится многократно оценивать Gn.

Минусы: (1) Требуетсямного памяти, и (2) не может быть легко векторизовано, чтобы избежать дополнительного цикла следующего вида (который снова оценивается много раз)

for ixs=1:Nx
  for ias=1:Nalp
    GGn=Gn{:,:, ixs, ias};
    SomeVector(ixs, ias)*GGn(Llnx, Lhnx);
  end
 end

(a) Если бы я мог как-тоВекторизация всего класса griddedInterpolant с именем Gn, я мог бы оптимизировать в последнем цикле, и (б) Если бы я мог сохранить вектор Ll и Lh только один раз, я мог бы использовать память более эффективно.

Мне нужна вашаПомогите.Точно, как я могу сделать это более эффективно?Спасибо.

Best,

BK

РЕДАКТИРОВАТЬ: Решение было бы создать функцию Gn, которая принимает Ll и Lh в качестве аргументов, учитывая x и alp.Gn возвращает массив функциональных дескрипторов, по одному для каждого (x, alph).Затем вызов Gn (Llnx, Lhnx, x, alp) возвращает интерполированное значение.Теперь (Llnx, Lhnx, x, alp) могут быть массивами одного и того же числа элементов.Любой эффективный способ, который использует код профессионала?

1 Ответ

0 голосов
/ 06 июня 2018

Используя предоставленный метод здесь вы можете предварительно вычислить весовые коэффициенты для многомерной линейной интерполяции.Поэтому вам не нужно griddedInterpolan t и использовать bsxfun для векторизации вычислений интерполяции с использованием предварительно вычисленных весов.

[W I]=lininterpnw(Ll, Lh, Llnx, Lhnx);
GGn = reshape(G,NL* NL,[]);
result = squeeze(sum(bsxfun(@times, W, reshape(GGn(I(:),:),size(G)))));
bsxfun(@times, reshape(SomeVector,1,[]), result);

Каждый столбец в матрице result являетсявывод интерполяции каждой двумерной матрицы.

Здесь предполагается, что 1Ll, Lh, Llnx, Lhnx - это векторы строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...