如何简化此代码并减少运行所需的时间?

时间:2013-12-02 04:08:58

标签: matlab for-loop performance convolution

我有一个完美的代码,我希望提高效率。

t = -1:.001:1;
t_for_y = -50:.01:50;
x = zeros(size(t));
x(1001:end) = exp(-3 * t(1001:end));
h = zeros(size(t));
h(1001:end) = exp(-2 * t(1001:end)); % FIXED TYPO
for k = 1:length(t_for_y)  
    X(k)=trapz(t,x.*exp(-1i*t*t_for_y(k)));   
    H(k)=trapz(t,h.*exp(-1i*t*t_for_y(k)));  
end
Y = X.*H;
for k = 1:length(t)  
    y(k) = (1/(2*pi))*trapz(t_for_y,Y.*exp(1i*t(k)*t_for_y)); 
end
plot(t,real(y));grid on;

我只想使用一个for-loop或者不使用循环这可能吗?

有没有办法更快地使用它?

1 个答案:

答案 0 :(得分:4)

trapz函数可以将矩阵作为第二个输入(有关详细信息,请参阅help trapz)。这意味着您的第一列可以替换为以下内容:

t_i = 1i*t';
exp_t = bsxfun(@times,t_i,t_for_y); % Precompute for speed
xexp = bsxfun(@times,x',exp_t);
hexp = bsxfun(@times,h',exp_t);
% NOTE: As you've got it, X and H are identical - I assume this is a typo
X = trapz(t,xexp,1);
H = trapz(t,xexp,1);

请注意,这会生成一些相当大的矩阵(〜2000 X 10000),如果你不小心,它会耗尽你的记忆。

第二个循环可以用类似的方式进行线性化:

% Using exp_t from the previous loop
yexp = bsxfun(@times,Y,exp_t);
% NOTE: As you've got it, X and H are identical - I assume this is a typo
y = trapz(t_for_y,xexp,2);

同样,这将使用大量内存。您可能会发现使用稀疏矩阵可以节省内存。

如果内存对您而言非常重要,那么您的原始代码会更好(尽管您应该预先分配XHy以获得轻微的速度提升),因为时间通过线性化保存它并不足以证明额外的内存。如果你有很多记忆,那么这种方法会稍快一点。