【问题标题】:MATLAB loop refactoringMATLAB 循环重构
【发布时间】:2022-01-02 14:32:34
【问题描述】:

我很想知道是否有更好的方式来表达以下循环:

To = 1;
fileName = "fourier/signal.txt";
spectrum_left(abs(spectrum_left) < 1e-3) = 0+0i;
Ts = 1 / Fs;
t = 0:Ts:To-Ts;
signal = load(fileName, "-ascii");
Ns = numel(signal);
Fs = Ns / To;

fr = f(abs(spectrum_left) > 0)
a = abs(spectrum_left(abs(spectrum_left) > 0))
p = angle(spectrum_left(abs(spectrum_left) > 0))

signal_synth = 0;
len = length(a);

for i=1:len
    a_i = a(i);
    p_i = p(i);
    f_i = fr(i);
    s_i = a_i * cos(2*pi*f_i*t + p_i)
    signal_synth = signal_synth + s_i;
end

非常感谢任何建议。新年快乐!

【问题讨论】:

    标签: matlab


    【解决方案1】:

    在 MATLAB 中,element-wise operators(前面有句点字符 (.))可以应用于数组。我使用(:) 运算符将向量转换为列向量。请注意,t 是一个行向量,当它与列向量组合时,结果将是一个由隐式扩展形成的矩阵。为了对值求和,使用函数sum,默认情况下沿矩阵的第一个维度求和,结果将是与t 大小相同的行向量。

    signal_synth = sum(a(:) .* cos(2 * pi * f(:) .* t + p(:)));
    

    使用矩阵乘法的更紧凑的形式:

    signal_synth = a(:).' * cos(2 * pi * f(:) .* t + p(:));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2011-11-05
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多