▲ 004_数値計算(電卓編?)

 mc (matrix calculator) はその名の通り電卓みたいなものです。計算式を入力し実行すると結果が得られます。関数も使えるようになっています。実行するには計算したい式を選択(ハイライト)し[計算]ボタンをクリックします。

sin(3.1415926*30/180);

0.5000

.OK.

 普通の電卓と違う所はエディタでドキュメント数式を書き、計算式を実行するとその結果がドキュメントに挿入される点です。当たり前なようですが計算式がいつも確認でき間違えたら修正できるので意外に便利です。

● 計算式の最後はセミコロン

 計算式の最後には必ずセミコロン ; を付けて下さい。これを付けないとエラーになります。このセミコロンは計算式の終わりを意味します。そのため複数の計算式を一度に実行する事ができます。

sin(3.1415926/2); cos(3.1415926/2);

● 結果の表示

 mc の計算は入力した計算式を逆ポーランド記法に変換し計算スタックを利用して計算しています。例えば 1+2; の計算は内部で 1,2,+,; に変換し数値をスタックにプッシュします。最初に1をスタックにプッシュし、次ぎに2をスタックにプッシュします。その次は数値ではなく演算子の+(二項演算子)なのでスタックの中の2つの数値をポップし計算結果を再度スタックにプッシュします。最後の ; がきた時点でスタックにデータが残っているのでこれを表示します。

 考え方はちょっと複雑ですが、要は計算の結果がスタックに残っていれば表示する。もし残っていなければ表示しないという事です。計算式だけなら必ず結果がスタックに残るので計算結果が表示されます。ところが次で説明する変数を使った代入文では計算結果を変数に代入するので結果はスタックに残りません。よって代入文では計算結果を表示しません。

● 変数を使う事ができる

n = 57;

(1+n)・n/2;

1653.0000

.OK.

 上記の計算式は1からnまでの和を公式を使って計算する例です。変数nを使いどこまでの和を計算するのか、その値をnに代入し公式を使って和を計算しています。このように mc では計算式に変数が使えるので公式をそのまま利用できるメリットがあります。 また変数は英字だけではなく日本語が使えるので何を計算しているかが判ります。下記は台形の面積を計算する公式です。変数の底辺と高さに値を代入し公式を使って面積を計算しています。

底辺 = 10;

高さ = 5;

面積 = 底辺・高さ/2;

面積;

25.0000

.OK.

 上記式の最後に「面積;」という行があります。これは計算結果を代入した変数面積の内容を表示しなさいという命令です。

● 複数のデータ

 mc では一つの変数に複数の値を代入することができます。複数の値を代入するには決まった書式があります。例えば 1,2,3,4 という四個のデータを代入する時は下記のように | で囲みます

a = |1,2,3,4|;

a/5;

0.2000 0.4000 0.6000 0.8000

.OK.

 何で | にしたかと言えば後で紹介する行列を意識しているからです。上記例では変数 a に1行4列のデータを代入しています。これを2行2列のデータとして代入する事もできます。

a = |1,2|

|3,4|;

a/5;

0.2000 0.4000

0.6000 0.8000

.OK.

 これで何で | を使っているのか納得できたのではと思います。本当は [] で書きたかったのですが複数行にわたるキャラクタが無いもので | にしました(行列式みたいですが我慢して下さい!)。

● 複数のデータ:その2

 さて mc では変数に複数のデータを代入する事ができました。これを応用すると面白い事ができます。[変数を使う事ができる]で紹介した1〜nまでの和の公式。この公式のnに複数のデータを代入してみましょう。

n = |1,2,3,4,5|;

(1+n)・n/2;

1.0000 3.0000 6.0000 10.0000 15.0000

.OK.

 どうでしょうか。公式は同じなのに変数nに複数のデータを与えると与えたデータの数だけ計算します。これが mc の特徴です。

● 変な演算子

 上記の公式で乗算の演算子が*ではなく・が使われています。実はこれには深い訳があります。行列は配列と異なり演算が定義されていると説明しました。そして簡単な例で演算をし、あたかも行列演算は意識しなくても良いという風に紹介してしまいました。実はこれ嘘なんです。和と差の演算に関しては人間の感覚に合うのですが行列の乗算は今まで習ってきた乗算とは違います。更に、行列には除算がありません(これ少し変な表現かも!)。

 mc では加減算に関しての演算子 +- は行列の要素同士の加減算になります。この例を下記に示します。

a = |4,5,6|;

b = |3,2,1|;

a+b;

a-b;

7.0000 7.0000 7.0000

1.0000 3.0000 5.0000

.OK.

 この加減算に関しては問題ないと思います。同様に乗算と除算は次のようになります。

a = |4,5,6|;

b = |3,2,1|;

a・b;

a/b;

12.0000 10.0000 6.0000

1.3333 2.5000 6.0000

.OK.

 ここで注意してもらいたいの乗算は ・ (オプション+8)で除算は / です。この二つは要素どうしの乗算と除算です。 / は良いとして ・ は*とは異なります。 mc では ・ のかわりに*を使うとエラーになります。*は上列の乗算であり要素どうしの乗算ではありません。これを注意して下さい。

 また行列には除算がなく似た演算に逆行列があります。 mc では逆行列は演算子ではなく関数( inv )を使っています。この逆行列の例を紹介しましょう。

a = |1,2,3||3,2,4||5,5,2|;

b = inv(a);

a*b;

1.0000 0.0000 0.0000

0.0000 1.0000 -0.0000

0.0000 0.0000 1.0000

.OK.

 このように行列では除算を行列の逆行列の乗算を使い似たような演算を実現しています。変数 a に a の逆行列を乗算すると対角要素が1の単位行列が得られます。マイクロソフトではありませんがこれは行列演算の仕様です。

 こんな面倒な行列演算の仕様は「変だ〜〜!」と思うかもしれません。意味もなくこんな面倒な仕様になっている訳ではありません。実に強力な処理を可能にする仕様なのです。これも後で紹介しますがデータの分析によく使われる多変量解析の重回帰分析の計算がたった一行で記述できてしまう。そんな強力な仕様なのです(バグを仕様と言い張るマイクロソフトと同じと思ってもらっては行列がかわいそう)。

● 要素同士の四則演算

 人間の感覚に合った要素同士の四則演算。これは演算子に + - ・ / を使うということを知っておいて下さい。*は行列の乗算なので間違えないように。

a = |4,5,6|;

b = |3,2,1|;

a+b;

a-b;

a・b;

a/b;

7.0000 7.0000 7.0000

1.0000 3.0000 5.0000

12.0000 10.0000 6.0000

1.3333 2.5000 6.0000

.OK.