【问题标题】:How can I create an array of ratios inside a for loop in MATLAB?如何在 MATLAB 的 for 循环中创建比率数组?
【发布时间】:2013-09-16 03:58:58
【问题描述】:

我想使用 for 循环创建一个音符数组或向量。每个音符,A、A#、B、C...等都是上一个/下一个的 2^(1/12) 比率。例如,音符 A 是 440Hz,而 A# 是 440 * 2^(1/12) Hz = 446.16Hz。

从 27.5Hz (A0) 开始,我想要一个循环迭代 88 次以创建每个音符频率高达 4186Hz 的数组,这样看起来像

f= [27.5 29.14 30.87 ... 4186.01]

到目前为止,我已经明白了这么多:

   f  = [];
for i=1:87,
   %what goes here
   %  f = [27.5 * 2^(i/12)]; ?

end

return;

【问题讨论】:

    标签: arrays matlab loops for-loop


    【解决方案1】:

    在matlab中不需要为此做循环,你可以简单地做:

    f = 27.5 * 2.^((0:87)/12)
    

    答案:

    f =
    
      Columns 1 through 13
    
             27.5       29.135       30.868       32.703       34.648       36.708       38.891       41.203       43.654       46.249       48.999       51.913           55
    
      Columns 14 through 26
    
            58.27       61.735       65.406       69.296       73.416       77.782       82.407       87.307       92.499       97.999       103.83          110       116.54
    
      Columns 27 through 39
    
           123.47       130.81       138.59       146.83       155.56       164.81       174.61          185          196       207.65          220       233.08       246.94
    
      Columns 40 through 52
    
           261.63       277.18       293.66       311.13       329.63       349.23       369.99          392        415.3          440       466.16       493.88       523.25
    
      Columns 53 through 65
    
           554.37       587.33       622.25       659.26       698.46       739.99       783.99       830.61          880       932.33       987.77       1046.5       1108.7
    
      Columns 66 through 78
    
           1174.7       1244.5       1318.5       1396.9         1480         1568       1661.2         1760       1864.7       1975.5         2093       2217.5       2349.3
    
      Columns 79 through 88
    
             2489         2637       2793.8         2960         3136       3322.4         3520       3729.3       3951.1         4186
    

    【讨论】:

      【解决方案2】:
      maxind = 87;
      f = zeros(1, maxind); % preallocate, better performance and avoids mlint warnings
      for ii=1:maxind
        f(ii) = 27.5 * 2^(ii/12);
      end
      

      我将循环变量命名为ii 的原因是因为i 是一个内置函数的名称。因此,将其用作变量名被认为是不好的做法。

      另外,在您的描述中,您说过要迭代 88 次,但上述循环仅迭代 1 到 87(包括两者)。如果要迭代 88 次,请将 maxind 更改为 88。

      【讨论】:

        猜你喜欢
        • 2020-11-24
        • 2012-09-21
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多