извлекать 2D из 3D данных, используя сжатие - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть временной ряд превышения поверхности моря Z (201x151x4200), где 4200 - это количество значений времени, а 201x151 - сетка xy. Многие Z-значения, особенно крайние значения, имеют Nans, и я хочу проверить, могу ли я интерполировать эти значения. В прошлом я проверял их на matlab следующим образом:

z1=squeeze(Z(1,1,:))/1000;
z2=squeeze(Z(1,10,:))/1000;
z3=squeeze(Z(1,20,:))/1000;
z4=squeeze(Z(1,30,:))/1000;

z1(isnan(z1)) = interp1(find(~isnan(z1)),z1(~isnan(z1)), find(isnan(z1)),'spline');
z2(isnan(z2)) = interp1(find(~isnan(z2)),z2(~isnan(z2)), find(isnan(z2)),'spline');
z3(isnan(z3)) = interp1(find(~isnan(z3)),z3(~isnan(z3)), find(isnan(z3)),'spline');
z4(isnan(z4)) = interp1(find(~isnan(z4)),z4(~isnan(z4)), find(isnan(z4)),'spline');

, затем я просто вручную выбирал, какие из них можно интерполировать, чтобы получить средний спектр с использованием периодограммы. Я бы не хотел делать это вручную, но попытался поймать l oop. Возможно ли это после сжатия Z в 2D?

1 Ответ

0 голосов
/ 06 апреля 2020

преобразуйте вашу 3D матрицу в массив ячеек, используя num2cell, и примените вашу функцию interp1 к каждому элементу ячейки, вызвав cellfun. следующий двухслойный метод заполняет эти недостающие данные, вызывая interp1 для всех точек, используя только точки данных, отличные от nan. Значения, отличные от nan, остаются неизменными.

% create a testing data
a=rand(10,20,30);
a(randi(numel(a),30))=nan;

% convert the 3D array into a 2D cell array
b=num2cell(a,3);

% interp every element using only the non-nan elements
% non-nan elements stay unchanged
a2=cellfun(@(x) interp1(find(~isnan(x)),squeeze(x(~isnan(x))), 1:numel(x),'spline'),b,'uni',false);
...