【问题标题】:How can I streamline this code and reduce the time it takes to run?如何简化此代码并减少运行时间?
【发布时间】:2013-12-02 04:08:57
【问题描述】:

我有一个完美运行的代码,我正在努力提高它的效率。

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 或者没有 for 循环这可能吗?

有没有更快的使用方法?

【问题讨论】:

  • 不知道matlab如何优化代码。假设它不做任何优化,只运行你给出的代码,那么你可以将你所做的任何计算存储到 temp 变量中并继续使用它而不是每次都计算。 exp(-1i*t*t_for_y(k)) 可以在循环之前计算和存储并重复使用,而不是每次都计算。 (1/(2*pi)) 可以在循环之前预先计算。但是改进这一点,我不认为你会看到减少循环有多大区别,但每一点改进都很重要。
  • 对于部分代码:exp(-1i*t*t_for_y(k)) 将其放在循环之外是否仍会随着循环的每个部分而增加?
  • exp(-1itt_for_y(k)) 该部分必须在循环内但计算一次并存储在变量中。

标签: matlab for-loop performance convolution


【解决方案1】:

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 以获得轻微的速度提升),因为通过线性化节省的时间并没有真的足以证明额外的内存是合理的。如果你有足够的内存,那么这个方法会稍微快一点。

【讨论】:

  • 如果这会占用内存,那么它如何提高效率?
  • 它通过同时处理数据集的较大部分来提高计算效率。这样做的副作用是它会使用更多内存 - 换句话说,它会更快,但会使用更多内存。
猜你喜欢
  • 2016-07-24
  • 2019-12-14
  • 2021-12-02
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多