table および timetable での直接計算
R2023a 以降
インデックス付けしてデータを抽出することなく、table および timetable で直接計算を実行できます。配列で使用されているのと同じ構文を使用して直接計算を実行するには、table および timetable が次の複数の条件を満たしている必要があります。
table および timetable のすべての変数のデータ型で計算がサポートされている必要があります。
一方のオペランドだけが table または timetable である演算を実行する場合、もう一方のオペランドは数値または logical 配列でなければなりません。
両方のオペランドがともに table または timetable である演算を実行する場合は、互換性のあるサイズでなければなりません。
この例では、table および timetable のインデックス付けを行わずに演算を実行する方法を説明します。sum
、mean
、cumsum
などの一般的な数学関数や統計関数を呼び出すこともできます。この例では、行と変数の順序が異なるが名前は一致している (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