我有一个完美的代码,我希望提高效率。
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
或者不使用循环这可能吗?
有没有办法更快地使用它?
答案 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);
同样,这将使用大量内存。您可能会发现使用稀疏矩阵可以节省内存。
如果内存对您而言非常重要,那么您的原始代码会更好(尽管您应该预先分配X
,H
和y
以获得轻微的速度提升),因为时间通过线性化保存它并不足以证明额外的内存。如果你有很多记忆,那么这种方法会稍快一点。