Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

メモリ効率を高めるためのプログラムによるルックアップ テーブルの最適化

次の例では、メモリ効率の高いルックアップ テーブルをプログラムにより生成する方法を説明します。ルックアップ テーブル オプティマイザーのコマンド ラインにおける同等の操作を使用して、以下を実行できます。

  • 既存の Lookup Table ブロックを最適化する。

  • Math Function ブロックからルックアップ テーブルを生成する。

  • 関数または関数ハンドルからルックアップ テーブルを生成する。

  • Subsystem ブロックからルックアップ テーブルを生成する。

ルックアップ テーブルを使用した関数の近似

この例では、関数 sin を近似するメモリ効率の高いルックアップ テーブルを生成する方法を説明します。FunctionApproximation.Problem オブジェクトを作成して近似の問題を定義します。

P = FunctionApproximation.Problem('sin')
P = 

  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x)sin(x)
           NumberOfInputs: 1
               InputTypes: "numerictype(0,16,13)"
         InputLowerBounds: 0
         InputUpperBounds: 6.2832
               OutputType: "numerictype(1,16,14)"
                  Options: [1x1 FunctionApproximation.Options]

Problem オブジェクトの FunctionToApproximate プロパティと NumberOfInputs プロパティはオブジェクトの定義から推測され、作成後は編集できません。他のすべてのプロパティは書き込み可能です。

FunctionApproximation.Options オブジェクトを編集して、最適化プロセスで使用する追加の制約を指定します。たとえば、生成されたルックアップ テーブルのブレークポイントを等間隔に制約します。

P.Options.BreakpointSpecification = 'EvenSpacing'
P = 

  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x)sin(x)
           NumberOfInputs: 1
               InputTypes: "numerictype(0,16,13)"
         InputLowerBounds: 0
         InputUpperBounds: 6.2832
               OutputType: "numerictype(1,16,14)"
                  Options: [1x1 FunctionApproximation.Options]

出力の絶対許容差と相対許容差などの追加の制約と語長の制約を指定します。

P.Options.AbsTol = 2^-10;
P.Options.RelTol = 2^-6;
P.Options.WordLengths = [8,16];

solve メソッドを使用して最適化の問題を解決します。MATLAB™ には、最適化プロセスの反復回数が表示されます。solve メソッドは FunctionApproximation.LUTSolution オブジェクトを返します。

S = solve(P)
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             48 |        0 |          2 |               8 |           16 |             EvenSpacing |     9.765625e-04, 1.007261e+00 |
|   1 |             32 |        0 |          2 |               8 |            8 |             EvenSpacing |     9.765625e-04, 1.007261e+00 |
|   2 |            672 |        0 |         41 |               8 |           16 |             EvenSpacing |     9.765625e-04, 3.322094e-02 |
|   3 |           1648 |        1 |        102 |               8 |           16 |             EvenSpacing |     9.765625e-04, 7.988139e-05 |
|   4 |            480 |        0 |         29 |               8 |           16 |             EvenSpacing |     9.765625e-04, 1.575496e-01 |
|   5 |           1104 |        0 |         68 |               8 |           16 |             EvenSpacing |     9.765625e-04, 1.970943e-03 |
|   6 |            352 |        0 |         21 |               8 |           16 |             EvenSpacing |     9.765625e-04, 3.322094e-02 |
|   7 |            320 |        0 |         19 |               8 |           16 |             EvenSpacing |     9.765625e-04, 9.553784e-02 |
|   8 |             64 |        0 |          2 |              16 |           16 |             EvenSpacing |     9.765625e-04, 9.853516e-01 |
|   9 |             48 |        0 |          2 |              16 |            8 |             EvenSpacing |     9.765625e-04, 9.853516e-01 |
|  10 |            640 |        1 |         38 |              16 |           16 |             EvenSpacing |     9.765625e-04, 6.281694e-04 |
|  11 |            624 |        0 |         37 |              16 |           16 |             EvenSpacing |     9.765625e-04, 3.435787e-03 |
|  12 |            496 |        0 |         29 |              16 |           16 |             EvenSpacing |     9.765625e-04, 9.943803e-04 |
|  13 |            480 |        0 |         28 |              16 |           16 |             EvenSpacing |     9.765625e-04, 1.238521e-03 |
|  14 |            560 |        0 |         33 |              16 |           16 |             EvenSpacing |     9.765625e-04, 1.970943e-03 |
|  15 |            592 |        0 |         35 |              16 |           16 |             EvenSpacing |     9.765625e-04, 3.679927e-03 |
|  16 |            608 |        0 |         36 |              16 |           16 |             EvenSpacing |     9.765625e-04, 2.703365e-03 |
|  17 |            352 |        1 |         20 |              16 |           16 |             EvenSpacing |     9.765625e-04, 5.671342e-04 |
|  18 |            336 |        0 |         19 |              16 |           16 |             EvenSpacing |     9.765625e-04, 1.325779e-03 |
|  19 |            208 |        0 |         11 |              16 |           16 |             EvenSpacing |     9.765625e-04, 3.430176e-02 |
|  20 |            272 |        0 |         15 |              16 |           16 |             EvenSpacing |     9.765625e-04, 1.043701e-02 |
|  21 |            304 |        0 |         17 |              16 |           16 |             EvenSpacing |     9.765625e-04, 4.526615e-03 |
|  22 |            320 |        0 |         18 |              16 |           16 |             EvenSpacing |     9.765625e-04, 2.378452e-03 |
|  23 |             48 |        0 |          2 |               8 |           16 |         EvenPow2Spacing |     9.765625e-04, 1.300802e+00 |
|  24 |             64 |        0 |          2 |              16 |           16 |         EvenPow2Spacing |     9.765625e-04, 1.300802e+00 |
|  25 |           1648 |        1 |        102 |               8 |           16 |         EvenPow2Spacing |     9.765625e-04, 7.988139e-05 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|  17 |            352 |        1 |         20 |              16 |           16 |             EvenSpacing |     9.765625e-04, 5.671342e-04 |


S = 

  1x1 FunctionApproximation.LUTSolution with properties:

          ID: 17
    Feasible: "true"

元の関数の数値的動作と解 S に保存されている生成されたルックアップ テーブルの数値的動作を比較します。

err = compare(S)
err = 

  struct with fields:

    Breakpoints: [51473x1 double]
       Original: [51473x1 double]
    Approximate: [51473x1 double]

LUTSolution オブジェクトに保存されたルックアップ テーブル データにアクセスできます。

t = S.TableData
t = 

  struct with fields:

       BreakpointValues: {[1x20 double]}
    BreakpointDataTypes: [1x1 embedded.numerictype]
            TableValues: [1x20 double]
          TableDataType: [1x1 embedded.numerictype]
          IsEvenSpacing: 1
          Interpolation: Linear

生成された Lookup Table ブロックにアクセスするには、approximate メソッドを使用します。

approximate(S)

既存のルックアップ テーブルの最適化

この例では、メモリの効率を高めるために既存の Lookup Table ブロックを最適化する方法を説明します。最適化する Lookup Table ブロックを含むモデルを開きます。

load_system('sldemo_fuelsys');
open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');

最適化の問題と制約を定義する FunctionApproximation.Problem オブジェクトを作成します。

P = FunctionApproximation.Problem('sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant')
P = 

  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant'
           NumberOfInputs: 2
               InputTypes: [1x2 string]
         InputLowerBounds: [50 0.0500]
         InputUpperBounds: [1000 0.9500]
               OutputType: "numerictype('single')"
                  Options: [1x1 FunctionApproximation.Options]

Problem オブジェクト P に関連付けられた Options オブジェクトを変更して追加の制約を指定します。

P.Options.BreakpointSpecification = "EvenSpacing"
P = 

  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant'
           NumberOfInputs: 2
               InputTypes: [1x2 string]
         InputLowerBounds: [50 0.0500]
         InputUpperBounds: [1000 0.9500]
               OutputType: "numerictype('single')"
                  Options: [1x1 FunctionApproximation.Options]

最適化の問題を解決します。

S = solve(P)
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |          12128 |        1 |    [18 19] |         [32 32] |           32 |          ExplicitValues |     7.812500e-03, 0.000000e+00 |
|   1 |          11840 |        1 |    [18 19] |         [16 32] |           32 |          ExplicitValues |     7.812500e-03, 0.000000e+00 |
|   2 |             80 |        0 |      [2 2] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 1.047640e-01 |
|   3 |            336 |        0 |      [6 6] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 5.359873e-02 |
|   4 |            288 |        0 |      [5 6] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 5.763923e-02 |
|   5 |            288 |        0 |      [6 5] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 5.852598e-02 |
|   6 |            248 |        0 |      [5 5] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 6.255026e-02 |
|   7 |           1016 |        0 |    [11 11] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.738934e-02 |
|   8 |            928 |        0 |    [10 11] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.983925e-02 |
|   9 |            928 |        0 |    [11 10] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.738934e-02 |
|  10 |            848 |        0 |    [10 10] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.983925e-02 |
|  11 |           3744 |        0 |    [21 22] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.080366e-02 |
|  12 |           3568 |        0 |    [20 22] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.188371e-02 |
|  13 |           3408 |        0 |    [21 20] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.080366e-02 |
|  14 |           3248 |        0 |    [20 20] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.188371e-02 |
|  15 |           7008 |        0 |    [29 30] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.208317e-02 |
|  16 |           9024 |        0 |    [33 34] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 2.954298e-02 |
|  17 |          10968 |        0 |    [35 39] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 2.700278e-02 |
|  18 |          11280 |        0 |    [36 39] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 2.700279e-02 |
|  19 |          11592 |        0 |    [37 39] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 2.700279e-02 |
|  20 |            840 |        0 |     [9 11] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 4.118272e-02 |
|  21 |            768 |        0 |     [9 10] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 4.118272e-02 |
|  22 |           3392 |        0 |    [19 22] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.296377e-02 |
|  23 |           3216 |        0 |    [18 22] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.404382e-02 |
|  24 |           3088 |        0 |    [19 20] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.296377e-02 |
|  25 |           2928 |        0 |    [18 20] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.404382e-02 |
|  26 |           1848 |        0 |    [15 15] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.396479e-02 |
|  27 |           1728 |        0 |    [14 15] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.528193e-02 |
|  28 |           1728 |        0 |    [15 14] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.396479e-02 |
|  29 |           1616 |        0 |    [14 14] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.528193e-02 |
|  30 |           6768 |        0 |    [28 30] |          [16 8] |            8 |             EvenSpacing |     7.812500e-03, 3.208317e-02 |
|  31 |            128 |        0 |      [2 2] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.050016e-01 |
|  32 |            384 |        0 |      [6 6] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 5.586659e-02 |
|  33 |            336 |        0 |      [5 6] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 5.984835e-02 |
|  34 |            336 |        0 |      [6 5] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 6.017463e-02 |
|  35 |            296 |        0 |      [5 5] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 6.433061e-02 |
|  36 |           1064 |        0 |    [11 11] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 3.046093e-02 |
|  37 |            976 |        0 |    [10 11] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 3.175766e-02 |
|  38 |            976 |        0 |    [11 10] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 3.295625e-02 |
|  39 |            896 |        0 |    [10 10] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 3.429314e-02 |
|  40 |           3624 |        0 |    [21 21] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.124774e-02 |
|  41 |           3456 |        0 |    [20 21] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.233026e-02 |
|  42 |           3456 |        0 |    [21 20] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.124774e-02 |
|  43 |           3296 |        0 |    [20 20] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.233026e-02 |
|  44 |           6824 |        1 |    [29 29] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 5.957022e-03 |
|  45 |           5096 |        0 |    [25 25] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.076232e-02 |
|  46 |           5928 |        0 |    [27 27] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 9.914692e-03 |
|  47 |           6368 |        0 |    [28 28] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 9.589452e-03 |
|  48 |            888 |        0 |     [9 11] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 3.302356e-02 |
|  49 |            816 |        0 |     [9 10] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 3.558207e-02 |
|  50 |           3288 |        0 |    [19 21] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.350690e-02 |
|  51 |           3120 |        0 |    [18 21] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.479964e-02 |
|  52 |           3136 |        0 |    [19 20] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.350690e-02 |
|  53 |           2976 |        0 |    [18 20] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.479964e-02 |
|  54 |           4704 |        0 |    [24 24] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.145920e-02 |
|  55 |           5504 |        0 |    [26 26] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.017491e-02 |
|  56 |           1896 |        0 |    [15 15] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.783914e-02 |
|  57 |           1776 |        0 |    [14 15] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.897344e-02 |
|  58 |           1776 |        0 |    [15 14] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 2.034441e-02 |
|  59 |           1664 |        0 |    [14 14] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 2.103841e-02 |
|  60 |           6592 |        0 |    [28 29] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 9.247549e-03 |
|  61 |           6592 |        0 |    [29 28] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 9.316519e-03 |
|  62 |           2984 |        0 |    [19 19] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.350690e-02 |
|  63 |           2832 |        0 |    [18 19] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.479964e-02 |
|  64 |           3576 |        0 |    [15 29] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.783914e-02 |
|  65 |           5200 |        0 |    [22 29] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.143289e-02 |
|  66 |           5896 |        0 |    [25 29] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.042340e-02 |
|  67 |           6360 |        0 |    [27 29] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 9.646382e-03 |
|  68 |           3576 |        0 |    [29 15] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 1.082333e-02 |
|  69 |           5200 |        1 |    [29 22] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 4.794985e-03 |
|  70 |           4272 |        1 |    [29 18] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 6.289935e-03 |
|  71 |           3808 |        0 |    [29 16] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 9.146322e-03 |
|  72 |           4040 |        1 |    [29 17] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 4.853550e-03 |
|  73 |            112 |        0 |      [2 2] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 1.054412e-01 |
|  74 |            624 |        0 |      [6 6] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 5.441330e-02 |
|  75 |            528 |        0 |      [5 6] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 5.850855e-02 |
|  76 |            528 |        0 |      [6 5] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 5.939646e-02 |
|  77 |            448 |        0 |      [5 5] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 6.331635e-02 |
|  78 |           1984 |        0 |    [11 11] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.825822e-02 |
|  79 |           1808 |        0 |    [10 11] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 4.057692e-02 |
|  80 |           1808 |        0 |    [11 10] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.825822e-02 |
|  81 |           1648 |        0 |    [10 10] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 4.057692e-02 |
|  82 |           2752 |        0 |    [13 13] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.730308e-02 |
|  83 |           3184 |        0 |    [14 14] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.596578e-02 |
|  84 |           3648 |        0 |    [15 15] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.462848e-02 |
|  85 |           1632 |        0 |     [9 11] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 4.191638e-02 |
|  86 |           1488 |        0 |     [9 10] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 4.191638e-02 |
|  87 |           3408 |        0 |    [14 15] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.596578e-02 |
|  88 |           3408 |        0 |    [15 14] |          [16 8] |           16 |             EvenSpacing |     7.812500e-03, 3.462848e-02 |
|  89 |            160 |        0 |      [2 2] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 1.056962e-01 |
|  90 |            672 |        0 |      [6 6] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 5.635968e-02 |
|  91 |            576 |        0 |      [5 6] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 6.042931e-02 |
|  92 |            576 |        0 |      [6 5] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 6.089415e-02 |
|  93 |            496 |        0 |      [5 5] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 6.486682e-02 |
|  94 |           2032 |        0 |    [11 11] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 3.087381e-02 |
|  95 |           1856 |        0 |    [10 11] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 3.201155e-02 |
|  96 |           1856 |        0 |    [11 10] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 3.321355e-02 |
|  97 |           1696 |        0 |    [10 10] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 3.438402e-02 |
|  98 |           2800 |        0 |    [13 13] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 2.427534e-02 |
|  99 |           3232 |        0 |    [14 14] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 2.115314e-02 |
| 100 |           3696 |        0 |    [15 15] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 1.867522e-02 |
| 101 |           1680 |        0 |     [9 11] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 3.326033e-02 |
| 102 |           1536 |        0 |     [9 10] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 3.565893e-02 |
| 103 |           3456 |        0 |    [14 15] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 1.988021e-02 |
| 104 |           3456 |        0 |    [15 14] |         [16 32] |           16 |             EvenSpacing |     7.812500e-03, 2.043030e-02 |
| 105 |             80 |        0 |      [2 2] |          [16 8] |            8 |         EvenPow2Spacing |     7.812500e-03, 8.762666e-02 |
| 106 |            560 |        0 |      [8 8] |          [16 8] |            8 |         EvenPow2Spacing |     7.812500e-03, 4.444923e-02 |
| 107 |           1848 |        0 |    [15 15] |          [16 8] |            8 |         EvenPow2Spacing |     7.812500e-03, 3.133052e-02 |
| 108 |            128 |        0 |      [2 2] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 8.876663e-02 |
| 109 |            608 |        0 |      [8 8] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 4.280622e-02 |
| 110 |           1896 |        0 |    [15 15] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 1.728861e-02 |
| 111 |            112 |        0 |      [2 2] |          [16 8] |           16 |         EvenPow2Spacing |     7.812500e-03, 8.821256e-02 |
| 112 |           1072 |        0 |      [8 8] |          [16 8] |           16 |         EvenPow2Spacing |     7.812500e-03, 4.520058e-02 |
| 113 |           3648 |        0 |    [15 15] |          [16 8] |           16 |         EvenPow2Spacing |     7.812500e-03, 3.195386e-02 |
| 114 |            160 |        0 |      [2 2] |         [16 32] |           16 |         EvenPow2Spacing |     7.812500e-03, 8.949983e-02 |
| 115 |           1120 |        0 |      [8 8] |         [16 32] |           16 |         EvenPow2Spacing |     7.812500e-03, 4.298368e-02 |
| 116 |           3696 |        0 |    [15 15] |         [16 32] |           16 |         EvenPow2Spacing |     7.812500e-03, 1.766077e-02 |
| 117 |            176 |        0 |      [2 2] |          [16 8] |           32 |         EvenPow2Spacing |     7.812500e-03, 8.821365e-02 |
| 118 |           2096 |        0 |      [8 8] |          [16 8] |           32 |         EvenPow2Spacing |     7.812500e-03, 4.520053e-02 |
| 119 |            224 |        0 |      [2 2] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 1.056971e-01 |
| 120 |           1248 |        0 |      [6 6] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 5.635974e-02 |
| 121 |           1056 |        0 |      [5 6] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 6.042954e-02 |
| 122 |           1056 |        0 |      [6 5] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 6.089419e-02 |
| 123 |            896 |        0 |      [5 5] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 6.486649e-02 |
| 124 |           3968 |        0 |    [11 11] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 3.087266e-02 |
| 125 |           3616 |        0 |    [10 11] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 3.201098e-02 |
| 126 |           3616 |        0 |    [11 10] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 3.321287e-02 |
| 127 |           3296 |        0 |    [10 10] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 3.438386e-02 |
| 128 |           3264 |        0 |     [9 11] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 3.325982e-02 |
| 129 |           2976 |        0 |     [9 10] |         [16 32] |           32 |             EvenSpacing |     7.812500e-03, 3.565864e-02 |
| 130 |            224 |        0 |      [2 2] |         [16 32] |           32 |         EvenPow2Spacing |     7.812500e-03, 8.950080e-02 |
| 131 |           2144 |        0 |      [8 8] |         [16 32] |           32 |         EvenPow2Spacing |     7.812500e-03, 4.298387e-02 |
| 132 |            128 |        0 |      [2 2] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 9.900912e-02 |
| 133 |            416 |        0 |      [8 5] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 5.790341e-02 |
| 134 |           1176 |        0 |     [15 9] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 3.455174e-02 |
| 135 |           3936 |        0 |    [30 16] |         [16 32] |            8 |         EvenPow2Spacing |     7.812500e-03, 1.060568e-02 |
| 136 |            224 |        0 |      [2 2] |         [16 32] |           32 |         EvenPow2Spacing |     7.812500e-03, 1.067945e-01 |
| 137 |           1216 |        0 |      [7 5] |         [16 32] |           32 |         EvenPow2Spacing |     7.812500e-03, 6.091571e-02 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|  72 |           4040 |        1 |    [29 17] |         [16 32] |            8 |             EvenSpacing |     7.812500e-03, 4.853550e-03 |


S = 

  1x1 FunctionApproximation.LUTSolution with properties:

          ID: 72
    Feasible: "true"

元のルックアップ テーブルの数値的動作を、最適化されたルックアップ テーブルと比較します。

compare(S)
ans = 

  1x2 struct array with fields:

    Breakpoints
    Original
    Approximate

approximate メソッドを使用して新しい Lookup Table ブロックを生成します。

S.approximate

メモリの最適化と絶対許容誤差の比較を示すパレート フロントの可視化

メモリと絶対許容誤差の両方を最適化する場合は、この 2 つのトレードオフを可視化すると役に立ちます。この例では、絶対許容誤差のさまざまなレベルを使用して関数 1-exp(-x) のルックアップ テーブル近似を作成し、検出された各解のプロットを作成します。最終的なプロットには、メモリの効率と数値忠実度のトレードオフを表示できます。

nTol = 32; % Initialize variables
solutions = cell(1,nTol);
objectiveValues = cell(1,nTol);
constraintValues = cell(1,nTol);
memoryUnits = 'bytes';

% Options for absolute tolerance
absTol = 2.^linspace(-12,-4,nTol);

% Relative tolerance is set to 0
relTol = 0;

% Initialize options
options = FunctionApproximation.Options( ...
    'RelTol', relTol, ...
    'BreakpointSpecification', 'EvenSpacing', ...
    'Display', false, ...
    'WordLengths', 16);

% Setup the approximation problem
problem = FunctionApproximation.Problem( ...
    @(x) 1 - exp(-x), ...
    'InputTypes',numerictype(0,16), ...
    'OutputType',numerictype(1,16,14), ...
    'InputLowerBounds',0, ...
    'InputUpperBounds',5, ...
    'Options',options);

% Execute to find solutions with different tolerances
for iTol = 1:nTol
    problem.Options.AbsTol = absTol(iTol);
    solution = solve(problem);
    objectiveValues{iTol} = arrayfun(@(x) x.totalMemoryUsage(memoryUnits), solution.AllSolutions);
    constraintValues{iTol} = arrayfun(@(x) x.Feasible, solution.AllSolutions);
    solutions{iTol} = solution;
end


% Plot results

h = figure();
hold on;

for iTol = 1:nTol
    for iObjective = 1:numel(objectiveValues{iTol})
        if constraintValues{iTol}(iObjective)
            markerColor = 'g';
        else
            markerColor = 'r';
        end
        plot(absTol(iTol),objectiveValues{iTol}(iObjective), ...
            'Marker', '.' ,'LineStyle', 'none', ...
            'MarkerSize', 24, ...
            'MarkerEdgeColor', markerColor)
    end
end

xlabel('AbsTol')
ylabel(['MemoryUsage (',memoryUnits,')'])
h.Children.XScale = 'log';
h.Children.YMinorGrid = 'on';
grid on
box on
hold off;

実行不可能な解、つまり必要な絶対許容誤差に一致しない解は赤でマークされています。実行可能な解は緑でマークされています。絶対許容誤差が増えると、近似によって、使用するメモリが少ない解が検出されます。絶対許容誤差が小さくなる、つまり数値忠実度が高くなると、必要なメモリも増えます。

曲線上のテーブルの値と曲線外のテーブルの値を使用した近似の比較

この例では、FunctionApproximation.Options オブジェクトの OnCurveTableValues プロパティが true または false に設定されている場合に、関数 tanh に対して生成されたルックアップ テーブル近似を比較します。OnCurveTableValues プロパティは、最適化されたルックアップ テーブルの近似のテーブル値が近似される元の関数の量子化値の出力と等しいかどうかを指定します。場合によっては、この値を false に設定することで、生成されたルックアップ テーブルの近似により、ルックアップ テーブルが使用するメモリを削減しながら同じ許容誤差を維持できます。

曲線上のテーブルの値を使用したルックアップ テーブル近似の作成

FunctionApproximation.Problem オブジェクトを使用して、ルックアップ テーブルを使用して近似を行う関数を定義します。既定では、関連付けられている Options オブジェクトの OnCurveTableValues プロパティは false に設定されています。テーブルの値を、近似される関数の量子化された出力に制約するには、このプロパティを true に設定します。

P1 = FunctionApproximation.Problem('tanh');
P1.Options.OnCurveTableValues = 1
P1 = 
  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x)tanh(x)
           NumberOfInputs: 1
               InputTypes: "numerictype(1,16,12)"
         InputLowerBounds: -8
         InputUpperBounds: 8
               OutputType: "numerictype(1,16,15)"
                  Options: [1x1 FunctionApproximation.Options]

ルックアップ テーブルの近似を生成します。

S1 = solve(P1)
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             64 |        0 |          2 |              16 |           16 |             EvenSpacing |     7.812500e-03, 9.999998e-01 |
|   1 |           1248 |        1 |         76 |              16 |           16 |             EvenSpacing |     7.812500e-03, 4.368265e-03 |
|   2 |           1232 |        1 |         75 |              16 |           16 |             EvenSpacing |     7.812500e-03, 4.439035e-03 |
|   3 |            944 |        1 |         57 |              16 |           16 |             EvenSpacing |     7.812500e-03, 7.780470e-03 |
|   4 |            928 |        0 |         56 |              16 |           16 |             EvenSpacing |     7.812500e-03, 7.990307e-03 |
|   5 |            656 |        0 |         39 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.678519e-02 |
|   6 |            640 |        0 |         38 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.660649e-02 |
|   7 |            784 |        0 |         47 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.102459e-02 |
|   8 |            864 |        0 |         52 |              16 |           16 |             EvenSpacing |     7.812500e-03, 9.403441e-03 |
|   9 |            896 |        0 |         54 |              16 |           16 |             EvenSpacing |     7.812500e-03, 8.643626e-03 |
|  10 |            912 |        0 |         55 |              16 |           16 |             EvenSpacing |     7.812500e-03, 8.316993e-03 |
|  11 |            496 |        0 |         29 |              16 |           16 |             EvenSpacing |     7.812500e-03, 2.894880e-02 |
|  12 |            720 |        0 |         43 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.355547e-02 |
|  13 |            832 |        0 |         50 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.019267e-02 |
|  14 |            880 |        0 |         53 |              16 |           16 |             EvenSpacing |     7.812500e-03, 8.881069e-03 |
|  15 |            448 |        1 |         14 |              16 |           16 |          ExplicitValues |     7.812500e-03, 7.801827e-03 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|  15 |            448 |        1 |         14 |              16 |           16 |          ExplicitValues |     7.812500e-03, 7.801827e-03 |
S1 = 
  1x1 FunctionApproximation.LUTSolution with properties:

          ID: 15
    Feasible: "true"

任意のテーブル値を使用したルックアップ テーブルの近似の作成

別の FunctionApproximation.Problem オブジェクトを作成します。このオブジェクトの OnCurveTableValues プロパティを false に設定することで、最適化を有効にしてテーブル値およびブレークポイントを最適化します。

P2 = FunctionApproximation.Problem('tanh');
P2.Options.OnCurveTableValues = 0
P2 = 
  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x)tanh(x)
           NumberOfInputs: 1
               InputTypes: "numerictype(1,16,12)"
         InputLowerBounds: -8
         InputUpperBounds: 8
               OutputType: "numerictype(1,16,15)"
                  Options: [1x1 FunctionApproximation.Options]

ルックアップ テーブルの近似を生成します。

S2 = solve(P2)
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |             64 |        0 |          2 |              16 |           16 |             EvenSpacing |     7.812500e-03, 9.999998e-01 |
|   1 |           1248 |        1 |         76 |              16 |           16 |             EvenSpacing |     7.812500e-03, 4.368265e-03 |
|   2 |           1232 |        1 |         75 |              16 |           16 |             EvenSpacing |     7.812500e-03, 4.439035e-03 |
|   3 |            944 |        1 |         57 |              16 |           16 |             EvenSpacing |     7.812500e-03, 7.780470e-03 |
|   4 |            928 |        1 |         56 |              16 |           16 |             EvenSpacing |     7.812500e-03, 6.110240e-03 |
|   5 |            656 |        0 |         39 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.678519e-02 |
|   6 |            640 |        0 |         38 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.660649e-02 |
|   7 |            784 |        1 |         47 |              16 |           16 |             EvenSpacing |     7.812500e-03, 7.743777e-03 |
|   8 |            704 |        1 |         42 |              16 |           16 |             EvenSpacing |     7.812500e-03, 7.805676e-03 |
|   9 |            672 |        1 |         40 |              16 |           16 |             EvenSpacing |     7.812500e-03, 7.809550e-03 |
|  10 |            368 |        0 |         21 |              16 |           16 |             EvenSpacing |     7.812500e-03, 4.855583e-02 |
|  11 |            512 |        0 |         30 |              16 |           16 |             EvenSpacing |     7.812500e-03, 2.773526e-02 |
|  12 |            592 |        0 |         35 |              16 |           16 |             EvenSpacing |     7.812500e-03, 2.088471e-02 |
|  13 |            624 |        0 |         37 |              16 |           16 |             EvenSpacing |     7.812500e-03, 1.870074e-02 |
|  14 |            384 |        1 |         12 |              16 |           16 |          ExplicitValues |     7.812500e-03, 7.812317e-03 |
|  15 |            384 |        0 |         12 |              16 |           16 |          ExplicitValues |     7.812500e-03, 1.196141e-02 |
|  16 |            384 |        1 |         12 |              16 |           16 |          ExplicitValues |     7.812500e-03, 7.812317e-03 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|  14 |            384 |        1 |         12 |              16 |           16 |          ExplicitValues |     7.812500e-03, 7.812317e-03 |
S2 = 
  1x1 FunctionApproximation.LUTSolution with properties:

          ID: 14
    Feasible: "true"

結果の表示

各ルックアップ テーブルの近似の最適解を比較します。

compare(S1)

Figure contains 2 axes. Axes 1 with title Comparison of Original Function and Approximation contains 2 objects of type line. These objects represent Original, Approximation. Axes 2 with title Feasibility of Solution: Feasible AbsTol = 0.0078125 RelTol = 0.0078125 contains 3 objects of type area, line. These objects represent Feasible Region : Absolute Error <= Max Error Allowed, Max Error Allowed : max(abs(Original) * RelTol, AbsTol), Absolute Error : abs(Original - Approximation).

ans = struct with fields:
    Breakpoints: [65536x1 double]
       Original: [65536x1 double]
    Approximate: [65536x1 double]

compare(S2)

Figure contains 2 axes. Axes 1 with title Comparison of Original Function and Approximation contains 2 objects of type line. These objects represent Original, Approximation. Axes 2 with title Feasibility of Solution: Feasible AbsTol = 0.0078125 RelTol = 0.0078125 contains 3 objects of type area, line. These objects represent Feasible Region : Absolute Error <= Max Error Allowed, Max Error Allowed : max(abs(Original) * RelTol, AbsTol), Absolute Error : abs(Original - Approximation).

ans = struct with fields:
    Breakpoints: [65536x1 double]
       Original: [65536x1 double]
    Approximate: [65536x1 double]

元の関数と 2 つのルックアップ テーブルの近似の間の最大誤差はほぼ等しくなりますが、曲線上のテーブルの値のみを使用するよう制限されていなかったルックアップ テーブルが使用するメモリはかなり節約されます。

percent_reduction = S2.totalMemoryUsage/S1.totalMemoryUsage
percent_reduction = 0.8571

参考

アプリ

クラス

関連するトピック