Main Content

table および timetable での直接計算

R2023a 以降

インデックス付けしてデータを抽出することなく、table および timetable で直接計算を実行できます。配列で使用されているのと同じ構文を使用して直接計算を実行するには、table および timetable が次の複数の条件を満たしている必要があります。

  • table および timetable のすべての変数のデータ型で計算がサポートされている必要があります。

  • 一方のオペランドだけが table または timetable である演算を実行する場合、もう一方のオペランドは数値または logical 配列でなければなりません。

  • 両方のオペランドがともに table または timetable である演算を実行する場合は、互換性のあるサイズでなければなりません。

この例では、table および timetable のインデックス付けを行わずに演算を実行する方法を説明します。summeancumsum などの一般的な数学関数や統計関数を呼び出すこともできます。この例では、行と変数の順序が異なるが名前は一致している (timetable の場合は、行時間が一致している) 場合に table および timetable で演算を実行する方法も示します。サポートされている関数および演算の全リストと、関連する使用規則については、Rules for Table and Timetable Mathematicsを参照してください。

R2023a より前、または数値変数と非数値変数が混在する table および timetable の場合は、table に数値データと非数値データの両方が含まれている場合の計算を参照してください。

スケール係数での table の乗算

単純な算術演算として、table を定数でスケーリングする演算があります。すべての table 変数で乗算がサポートされている場合は、table からデータを抽出することなく table をスケーリングできます。

たとえば、関数 readtable を使用して、CSV (コンマ区切り値) ファイル testScoresNumeric.csv から table へデータを読み取ります。このサンプル ファイルには、3 つのテストそれぞれの 10 個のテストの得点が含まれています。

testScores = readtable("testScoresNumeric.csv")
testScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

     90       87       93  
     87       85       83  
     86       85       88  
     75       80       72  
     89       86       87  
     96       92       98  
     78       75       77  
     91       94       92  
     86       83       85  
     79       76       82  

テストの得点は 100 点満点制です。25 点満点制の得点に変換するには、table に 0.25 を乗算します。table および timetable を乗算するには、times 演算子 .* を使用します。

scaledScores = testScores .* 0.25
scaledScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

     22.5    21.75    23.25
    21.75    21.25    20.75
     21.5    21.25       22
    18.75       20       18
    22.25     21.5    21.75
       24       23     24.5
     19.5    18.75    19.25
    22.75     23.5       23
     21.5    20.75    21.25
    19.75       19     20.5

テストごとにスケールが異なる場合は、table をベクトルで乗算できます。一方のオペランドが table または timetable である演算を実行する場合、もう一方のオペランドは、互換性のあるサイズをもつスカラー、ベクトル、行列、table、または timetable でなければなりません。

たとえば、行ベクトルを使用して、異なる係数で各テストに重みを付けます。

weightedScores = testScores .* [0.2 0.3 0.5]
weightedScores=10×3 table
    Test1    Test2    Test3
    _____    _____    _____

      18     26.1     46.5 
    17.4     25.5     41.5 
    17.2     25.5       44 
      15       24       36 
    17.8     25.8     43.5 
    19.2     27.6       49 
    15.6     22.5     38.5 
    18.2     28.2       46 
    17.2     24.9     42.5 
    15.8     22.8       41 

table の和と平均値の計算

table では一般的な数学関数や統計関数もサポートされています。たとえば、table の各行における重みが付けられたテストの得点の和を計算します。行全体の和を求めるには、sum を呼び出す際に table の 2 番目の次元を指定します。

sumScores = sum(weightedScores,2)
sumScores=10×1 table
    sum 
    ____

    90.6
    84.4
    86.7
      75
    87.1
    95.8
    76.6
    92.4
    84.6
    79.6

各テストの平均点を計算するには、関数 mean を使用します。既定では、mean は table の最初の次元である変数に沿って計算します。

meanScores = mean(weightedScores)
meanScores=1×3 table
    Test1    Test2    Test3
    _____    _____    _____

    17.14    25.29    42.85

timetable の累積和の計算

timetable では、table でサポートされているのと同じ演算、数学関数、および統計関数がサポートされています。

たとえば、200 Hz でサンプリングされた、50 秒の期間における地震の本震の振幅を記録した timetable を読み込みます。3 つの timetable 変数は、加速度計で測定された衝撃波の 3 つの方向成分に対応しています。

load quakeData
quakeData
quakeData=10001×3 timetable
      Time       EastWest    NorthSouth    Vertical
    _________    ________    __________    ________

    0.005 sec       5            3            0    
    0.01 sec        5            3            0    
    0.015 sec       5            2            0    
    0.02 sec        5            2            0    
    0.025 sec       5            2            0    
    0.03 sec        5            2            0    
    0.035 sec       5            1            0    
    0.04 sec        5            1            0    
    0.045 sec       5            1            0    
    0.05 sec        5            0            0    
    0.055 sec       5            0            0    
    0.06 sec        5            0            0    
    0.065 sec       5            0            0    
    0.07 sec        5            0            0    
    0.075 sec       5            0            0    
    0.08 sec        5            0            0    
      ⋮

衝撃の伝播速度を計算します。まず、timetable を重力加速度で乗算します。

quakeData = 0.098 .* quakeData
quakeData=10001×3 timetable
      Time       EastWest    NorthSouth    Vertical
    _________    ________    __________    ________

    0.005 sec      0.49        0.294          0    
    0.01 sec       0.49        0.294          0    
    0.015 sec      0.49        0.196          0    
    0.02 sec       0.49        0.196          0    
    0.025 sec      0.49        0.196          0    
    0.03 sec       0.49        0.196          0    
    0.035 sec      0.49        0.098          0    
    0.04 sec       0.49        0.098          0    
    0.045 sec      0.49        0.098          0    
    0.05 sec       0.49            0          0    
    0.055 sec      0.49            0          0    
    0.06 sec       0.49            0          0    
    0.065 sec      0.49            0          0    
    0.07 sec       0.49            0          0    
    0.075 sec      0.49            0          0    
    0.08 sec       0.49            0          0    
      ⋮

次に、加速度データを積分して伝播速度を計算します。各変数の累積和を計算して積分を近似できます。累積和を timetable のタイム ステップでスケーリングします。関数 cumsum は、入力とサイズおよび行時間が同じである timetable を返します。

speedQuake = (1/200) .* cumsum(quakeData)
speedQuake=10001×3 timetable
      Time       EastWest    NorthSouth    Vertical
    _________    ________    __________    ________

    0.005 sec    0.00245      0.00147         0    
    0.01 sec      0.0049      0.00294         0    
    0.015 sec    0.00735      0.00392         0    
    0.02 sec      0.0098       0.0049         0    
    0.025 sec    0.01225      0.00588         0    
    0.03 sec      0.0147      0.00686         0    
    0.035 sec    0.01715      0.00735         0    
    0.04 sec      0.0196      0.00784         0    
    0.045 sec    0.02205      0.00833         0    
    0.05 sec      0.0245      0.00833         0    
    0.055 sec    0.02695      0.00833         0    
    0.06 sec      0.0294      0.00833         0    
    0.065 sec    0.03185      0.00833         0    
    0.07 sec      0.0343      0.00833         0    
    0.075 sec    0.03675      0.00833         0    
    0.08 sec      0.0392      0.00833         0    
      ⋮

スケーリングされた累積和の平均値を計算します。関数 mean は 1 行の table として出力を返します。

meanQuake = mean(speedQuake)
meanQuake=1×3 table
    EastWest    NorthSouth    Vertical
    ________    __________    ________

     4.6145       -11.51      -7.2437 

平均値を減算することにより、スケーリングされた累積和をセンタリングします。出力は、各成分の伝播速度を含む timetable です。

speedQuake = speedQuake - meanQuake
speedQuake=10001×3 timetable
      Time       EastWest    NorthSouth    Vertical
    _________    ________    __________    ________

    0.005 sec    -4.6121       11.511       7.2437 
    0.01 sec     -4.6096       11.513       7.2437 
    0.015 sec    -4.6072       11.514       7.2437 
    0.02 sec     -4.6047       11.515       7.2437 
    0.025 sec    -4.6023       11.516       7.2437 
    0.03 sec     -4.5998       11.517       7.2437 
    0.035 sec    -4.5974       11.517       7.2437 
    0.04 sec     -4.5949       11.518       7.2437 
    0.045 sec    -4.5925       11.518       7.2437 
    0.05 sec       -4.59       11.518       7.2437 
    0.055 sec    -4.5876       11.518       7.2437 
    0.06 sec     -4.5851       11.518       7.2437 
    0.065 sec    -4.5827       11.518       7.2437 
    0.07 sec     -4.5802       11.518       7.2437 
    0.075 sec    -4.5778       11.518       7.2437 
    0.08 sec     -4.5753       11.518       7.2437 
      ⋮

行と変数の順序が異なる演算

table および timetable には変数が含まれ、変数には名前があります。また、table 行にも行の名前を設定できます。timetable の行は常に行時間をもちます。2 つの table または timetable で演算する場合、その変数および行は以下の条件を満たす必要があります。

  • 両方のオペランドのサイズが同じであるか、一方が 1 行の table でなければなりません。

  • 両方のオペランドに同じ名前をもつ変数が含まれている必要があります。ただし、各オペランドの変数の順序は異なっていてもかまいません。

  • 両方のオペランドが table で、行名をもつ場合、行名は同じでなければなりません。ただし、各オペランドの行名の順序は異なっていてもかまいません。

  • 両方のオペランドが timetable の場合、行時間が同じでなければなりません。ただし、各オペランドの行時間の順序は異なっていてもかまいません。

たとえば、2 つの table を作成して追加します。これらの table には変数名が含まれていますが、行名はありません。変数の順序は同じです。

A = table([1;2],[3;4],VariableNames=["V1","V2"])
A=2×2 table
    V1    V2
    __    __

    1     3 
    2     4 

B = table([1;3],[2;4],VariableNames=["V1","V2"])
B=2×2 table
    V1    V2
    __    __

    1     2 
    3     4 

C = A + B
C=2×2 table
    V1    V2
    __    __

    2     5 
    5     8 

ここで、行名と変数の順序が異なる 2 つの table を作成します。

A = table([1;2],[3;4],VariableNames=["V1","V2"],RowNames=["R1","R2"])
A=2×2 table
          V1    V2
          __    __

    R1    1     3 
    R2    2     4 

B = table([4;2],[3;1],VariableNames=["V2","V1"],RowNames=["R2","R1"])
B=2×2 table
          V2    V1
          __    __

    R2    4     3 
    R1    2     1 

table を加算します。結果として、式の最初の table の変数および行と同じ順序の変数および行をもつ table が得られます。

C = A + B
C=2×2 table
          V1    V2
          __    __

    R1    2     5 
    R2    5     8 

同様に、2 つの timetable を加算します。結果として、最初の timetable と同じ順序の変数および行時間をもつ timetable が得られます。

A = timetable(seconds([15;30]),[1;2],[3;4],VariableNames=["V1","V2"])
A=2×2 timetable
     Time     V1    V2
    ______    __    __

    15 sec    1     3 
    30 sec    2     4 

B = timetable(seconds([30;15]),[4;2],[3;1],VariableNames=["V2","V1"])
B=2×2 timetable
     Time     V2    V1
    ______    __    __

    30 sec    4     3 
    15 sec    2     1 

C = A + B
C=2×2 timetable
     Time     V1    V2
    ______    __    __

    15 sec    2     5 
    30 sec    5     8 

参考

| |

関連するトピック