在Matlab中内插不同时间的矩阵

时间:2018-08-09 16:31:21

标签: matlab grid interpolation

我已经为特定的时间向量计算了存储在矩阵中的变量。 现在,我想在整个矩阵之间进行插值以获得一个新的时间向量,以获得所需的新时间向量的矩阵。

我想出了以下解决方案,但它看起来笨拙且计算量大:

clear all;

a(:,:,1) = [1 1 1;2 2 2;3 3 3]; % Matrix 1
a(:,:,2) = [4 4 4;6 6 6;8 8 8]; % Matrix 2

t1 = [1 2]; % Old time vector

t2 = [1 1.5 2]; % New time vector

% Interpolation for each matrix element
for r = 1:1:size(a,2)
for c = 1:1:size(a,1)
tab(:) = a(r,c,:);
tabInterp(r,c,:) = interp1(t1,tab(:),t2);
end
end

结果是并且应该是:

[2.5000    2.5000    2.5000
    4.0000    4.0000    4.0000
    5.5000    5.5000    5.5000]

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以手动进行线性插值,一次即可...

m = ( t2 - t1(1) ) / ( t1(2) - t1(1) );  
% Linear interpolation using the standard 'y = m*x + c' linear structure
tabInterp = reshape(m,1,1,[]) .* (a(:,:,2)-a(:,:,1)) + a(:,:,1);

只要t2有2个元素,这将适用于任何大小t1

如果t1包含两个以上元素,则可以使用m创建缩放矢量interp1。这是相对有效的,因为您只使用interp1作为时间向量,而不是矩阵:

m = interp1( t1, (t1-min(t1))/(max(t1)-min(t1)), t2, 'linear', 'extrap' );

这通过.*操作使用隐式扩展,该操作需要R2016b或更高版本。如果您有较旧的MATLAB版本,请使用bsxfun来实现相同的功能。

答案 1 :(得分:1)

我真的没有发现基于循环的方法有问题,但是如果您正在寻找无循环方法,则可以执行以下操作。

[rows, cols, ~] = size(a);
aReshape = reshape(a, rows*cols, []).';
tabInterp = reshape(interp1(t1, aReshape, t2).', rows, cols, []);

在查看interp1的源代码时,似乎正在使用for循环,因此我怀疑这会导致性能提高。