使用挤压从3D数据中提取2D

问题描述 投票:0回答:1

我有一个海平面标高的时间序列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');

然后,我将手动选择可以插值的那些,以便使用周期图获得平均频谱。我不想手动执行此操作,而是尝试使用try和catch循环。将Z压缩为2D后可以吗?

matlab try-catch spectrum
1个回答
0
投票

使用num2cell将3D矩阵转换为单元格数组,并通过调用interp1cellfun函数应用于单元格的每个元素。接下来的两行代码通过仅使用非Nan数据点为所有点调用interp1来填充那些丢失的数据。非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);
© www.soinside.com 2019 - 2024. All rights reserved.