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

Posted

技术标签:

【中文标题】使用挤压从 3D 数据中提取 2D【英文标题】:extract 2D from 3D data using squeeze 【发布时间】:2020-04-06 07:08:06 【问题描述】:

我有一个海平面高程 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');

然后我只需手动选择哪些可以插值,以便使用周期图获得平均频谱。我希望不必手动执行此操作,而是在某种尝试和捕获循环中。将Z压缩成2D后这可能吗?

【问题讨论】:

我不太明白您手动执行的操作。在任何情况下,您都可以将上述内容放在for-loop =P 【参考方案1】:

使用 num2cell 将您的 3D 矩阵转换为元胞数组,并通过调用 cellfun 将您的 interp1 函数应用于元胞的每个元素。以下两条线通过仅使用非 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);

【讨论】:

我认为使用for 循环会比较有利,因为它不需要复制数据(创建元胞数组)。 是的,FangQ,谢谢你,但正如我所说,interp1 是一个测试。有些单元格会通过,有些单元格会失败。我想抓住并储存那些通过的。有什么想法吗?

以上是关于使用挤压从 3D 数据中提取 2D的主要内容,如果未能解决你的问题,请参考以下文章

使用 pcl 或 opencv 在 2d 场景中匹配 3d 模型

如何在 Unity 中从 3D 对象中获取 2D 视图/纹理

使用 PCA 进行图像分析/特征提取

Unity3D:通过 C# 脚本从 FBX 中提取纹理

平滑2D曲线

无法提取图纸的模型视图属性