如何从线性间隔轴到对数间隔轴执行矩阵插值?

时间:2017-08-03 00:07:12

标签: arrays matlab matrix interpolation

任何人都知道如何将能量谱矩阵线性间隔到矩阵,其中一个轴是以对数间隔而不是线性间隔的?

我的能谱矩阵的大小是64x165。原始x轴表示方向上的能量变化,原始y轴表示频率方面的能量变化。两个矢量线性间隔(每个矢量位置之间的间隔相同)。我希望将此矩阵插值为24x25格式,其中x轴(方向)继续线性间隔(现在是24个位置而不是64个位置的矢量)但是y轴(频率)不再是线性间隔;它是位置之间具有不同间隔的向量(位置2和位置1之间的间隔小于该向量的位置3和位置2之间的间隔......依此类推到位置25)。 重要的是要指出所有向量(包括新的频率对数间隔向量)都是已知的(我不想生成它们)。

我尝试了函数interp2和griddata。两个函数都显示了相同的结果,但是这个结果与原始光谱完全不同(因为我刚刚进行了插值,所以我不希望发生这种情况)。有人可以帮忙吗?我使用Matlab 2011 for Windows。

小例子:

freq_input=[0.038592 0.042451 0.046311 0.05017 0.054029 0.057888 0.061747 0.065607 0.069466 0.073325]; %Linearly spaced
dir_input=[0 45 90 135 180 225 270 315]; %Linearly spaced

matrix_input=[0.004 0.006 1.31E-06 0.011 0.032 0.0007 0.010 0.013 0.001 0.008
0.007 0.0147 3.95E-05 0.023 0.142 0.003 0.022 0.022 0.003 0.017
0.0122 0.0312 0.0012 0.0351 0.285 0.024 0.048 0.036 0.015 0.036
0.0154 0.0530 0.0185 0.0381 0.242 0.102 0.089 0.058 0.060 0.075
0.0148 0.0661 0.1209 0.0345 0.095 0.219 0.132 0.087 0.188 0.140
0.0111 0.0618 0.2232 0.0382 0.027 0.233 0.156 0.119 0.370 0.187
0.0069 0.0470 0.1547 0.0534 0.010 0.157 0.154 0.147 0.436 0.168
0.0041 0.0334 0.0627 0.0646 0.009 0.096 0.136 0.163 0.313 0.112]; %8 lines (directions) and 10 columns (frequencies)

freq_output=[0.412E-01 0.453E-01 0.498E-01 0.548E-01 0.603E-01]; %Logarithimically spaced
dir_output=[0 45 90 135 180 225 270 315]; %The same as dir_input

使用freq_input和dir_input向量进行了网格网格,使用freq_output和dir_output进行了网格网格后,我尝试了interp2(freq_input,dir_input,matrix,freq_output,dir_output)griddata(freq_input,dir_input,matrix,freq_output,dir_output),结果似乎不对。

1 个答案:

答案 0 :(得分:0)

您描述的操作过程应该可以正常工作,因此当您说“结果似乎错误”时,您可能会在插值后误解结果。

这就是我的意思,假设你的问题是假数据:

% interpolate using griddata
matrix_output = griddata(freq_input,dir_input,matrix_input,freq_output.',dir_output);

% need 2d arrays later for scatter plotting the result
[freq_2d,dir_2d] = meshgrid(freq_output,dir_output);

figure;
% plot the original data
surf(freq_input,dir_input,matrix_input);
hold on;

scatter3(freq_2d(:),dir_2d(:),matrix_output(:),'rs');

结果显示表面图(基于原始输入数据),红色正方形叠加在其上:插值

result: red interpolated squares matching the input surface

您可以看到线性插值数据值完全遵循由surf绘制的双线性曲面(在3d中旋转图形使得这更加明显)。换句话说,插值和后续绘图很好。