我已经为特定的时间向量计算了存储在矩阵中的变量。 现在,我想在整个矩阵之间进行插值以获得一个新的时间向量,以获得所需的新时间向量的矩阵。
我想出了以下解决方案,但它看起来笨拙且计算量大:
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]
有什么想法吗?
答案 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
循环,因此我怀疑这会导致性能提高。