V - 一个NxS的矩阵,表示测量值
T - 一个NxS的矩阵,表示测量时间
我想生成一个VI矩阵,来代表在时刻TI的线性插值测量值。
以下是非向量化版本的代码:
tic;
VI = zeros([size(V,1), size(TI,2)]);
for j = 1:size(V,1)
VI(j,:) = interp1(T(j,:),V(j,:),TI);
end
toc;
我希望重写这段代码,消除for循环,改用矩阵运算和函数实现。是否可以向量化?
tic;
VI = zeros([size(V,1), size(TI,2)]);
for j = 1:size(V,1)
VI(j,:) = interp1(T(j,:),V(j,:),TI);
end
toc;
我希望重写这段代码,消除for循环,改用矩阵运算和函数实现。是否可以向量化?
interp1q
代替interp
,这样就不需要对数据进行任何检查。interp1q
正常工作,x必须是单调递增的列向量。Y必须是长度为x行数的列向量或矩阵。xi必须是列向量。[N, S] = size(V);
VT = V'; % Value series in columns
TT = T'; % Time series in columns
VIT = zeros(length(TI), N); % Interpolated value series in columns
for j = 1:N
VIT(:, j) = interp1(VT(:, j), TT(:, j), TI);
end
VI = VIT'; % Interpolated value series in rows
很遗憾,我认为无法进一步改善此代码的性能,因为不同的值系列没有相关的时间序列。如果它们有相同的时间,以便我们可以将T
折叠成一个向量,使length(T) = S
,那么这将很容易实现:
VIT = interp1(VT, T, TI); % (see VIT and VT from above)
如果您所说的所有测量都有不同的测量时间(T是矩阵而不是向量),您可以通过一次对arrayfun的调用来实现所需操作,如下所示:
VI = arrayfun(@(x)(interp1(T(x,:),V(x,:),TI)), 1:size(V, 1), 'UniformOutput', false);
VI = cell2mat(VI');
arrayfun类似于循环,但由于它是一个内部的matlab函数,所以它可能更快。它返回一个向量的单元格,因此第二行确保您有一个矩阵作为输出。您可能不需要它-这取决于您稍后对数据要做什么。
另一方面,如果在不同的N值下同时进行了测量(T是大小为S的向量,而不是矩阵,或者换句话说,T的所有行都相等),则可以在一次调用interp1中进行插值。
VI = interp1(T(1,:), V', TI)
在interp1内插列时,您必须转置V。这是因为MATLAB按列存储矩阵(列在内存中是连续的)。如果将V作为SxN矩阵传递,则可能允许更有效的interp1并行化,因为所有CPU可以更有效地访问内存。因此,我建议您在整个代码中转置矩阵,除非您在某些其他地方依赖于此确切的数据布局以提高性能。
编辑由于矩阵的列布局,您的原始代码可以通过转置矩阵并按列处理来改进。对于N = 1000,S = 10000和TI为10000个元素,以下版本在我的计算机上快约20%。由于更有效的内存带宽利用,它可能会随着系统大小而增长。
tic;
VI = zeros(size(TI,2), size(V,2));
for j = 1:size(V,2)
VI(:,j) = interp1(T(:,j),V(:,j),TI);
end
toc;
interp1
(我以前从未使用过),如果下面的回答不当,请提前道歉。mat2cell
和cellfun
来消除显式循环。NumRow = 4;
NumCol = 3;
V = randn(NumRow, NumCol);
VCell = mat2cell(V, ones(NumRow, 1), NumCol);
A = cellfun(@sum, VCell);
当然,我做的事情等同于sum(V,2)
。但我认为我使用的方法也适用于你的情况。 mat2cell
函数将V
转换为一个单元列向量,其中每个单元格包含V的一行。然后对VCell
中的每个单元格应用sum
函数,并将结果返回到A
中的cellfun
调用。您可以尝试简单地将@sum
替换为@interp1
,并当然适当地调整cellfun
的输入。
如果您无法使其正常工作,就请告诉我,我会在回家后尽力为您提供更明确的解决方案。如果您成功了,但速度并没有显著提高,我会非常感兴趣知道这一点,请在此处发布结果。