1.Introduction
最近又遇到了矩阵插值(重采样)的问题,在最开始写博客的时候就写了篇关于
Excel
重采样的文章,不过在逐渐熟悉
Matlab
的过程中,还是决定看看能不能编程自动实现,不出所料,Matlab果然是万能的。如下图所示,本文以3×3为例,将其插值到9×9。
2.Materials and methods
首先,最简单的插值即线性插值,可以把上图的过程理解为两步。
(1)对每两列之间求均值并插入其中,可多次重复
(1)对每两行之间求均值并插入其中,可多次重复
如果每次都一步步手动计算那真的是累死了(上面这张图做的我更爱Matlab了),所以我们接下来使用
Matlab
全自动完成上述操作。代码如下。
A = [1 2 3;4 5 6;7 8 9]; % 生成3×3原始矩阵
x = 1:4:9; % 原始矩阵插值后的x轴坐标位置,即第1、5、9个
y = 1:4:9; % y轴坐标含义同上
[X,Y] = meshgrid(x,y); % 过渡
x = 1:9; % 插值后矩阵的x轴数值,即[1 2 3 4 5 6 7 8 9]
y = 1:9; % y轴坐标含义同上
[Xq,Yq] = meshgrid(x,y); % 过渡
B = interp2(X,Y,A,Xq,Yq); % 生成线性插值后的矩阵
3. Results and discussion
代码运行结果如下图,代码中具体变量含义和格式,可以直接在工作区查看,在此不做赘述。
本文开篇提到线性插值是最为简单的一种方法,下面介绍下非线性插值:
B = interp2(X,Y,A,Xq,Yq); % 生成线性插值后的矩阵
C = interp2(X,Y,A,Xq,Yq,'cubic'); % 生成非线性插值后的矩阵
你没有看错,就是把之前代码的最后一行代码,稍作修改。为了更好的展示效果,我们以
magic(3)
矩阵为例,将其插值到9×9。
通过二维矩阵可能很难感受到两个矩阵的区别(B vs. C),接下来将其转为三维热度图,如下图 。
同时,如果你只想对列之间进行插值,行间保持不变。代码做相应修改即可,如下所示。
4. Conclusion
本文提出的方法可以对任意大小的二维矩阵进行任意次的线性/非线性插值,对比Excel效果大幅度提高。但是在对原始矩阵插值时需要计算下现有坐标插值后的对应坐标,需要读者具备小学三年级以上的数学水平~
猜你喜欢:👇🏻
⭐
excel大数据重采样批量操作(每两列中插入新一列,新一列为左右两列的平均值)
⭐
【Matlab】一种超简单的二维矩阵降维方法
⭐
【Matlab】如何简单实现数组间交集,并集和补集?