![]() |
前回までに行列の基本的な話をしてきたけど、「ちょっとした計算をするだけでも、意外と計算量が多い」
ことは分かってもらえたかな? 行列式の計算もだけど、単に行列の積を計算するだけでもけっこう大変なのよね。 というわけで、このページでは表計算ソフトを使った行列の計算を紹介しま〜す。 もちろん最初からこういうのに頼るのは よくなくて、やっぱり自分の手を動かして計算練習をしてみることが大切なんだけど、 検算とかするには便利だし、 覚えておくと意外と便利なこともあるのよ。 まあ、内容としてはごく初歩的なことしかやらないから「そんなの 知ってるよ」って人は飛ばしちゃってもいいと思うよ。 |
![]() |
え〜っと、画面の写真は Excel 2007 だけどだいたい前のバージョンのやつでも大丈夫です。 それから、 用語なんかも Excel をもとにするけど、 Excel 持ってなくても OpenOffice.org でも同じやり方でいけるんだって。 (ただ、 Excel では区切りをコンマで書くけど、 OpenOffice Calc ではセミコロンを使う ことに注意してくださいね。) |
![]() |
ではまず、簡単な例から・・・ これの前のページで、行列 の行列式の値が -5 になる、という
のを計算したけど、これを確かめてみましょう。とりあえず、適当に新しいシートを作って、左上の部分 (ホントはどこでもいいけど)に、この行列と同じ形に数字を打ち込んでおきましょう。 |
![]() |
ここで、行列式を求めるための関数である「 MDETERM 」を使うの。 行列の範囲を指定してやれば、これだけで 行列式の値を計算してくれるのよ。 「 M 」は行列 ( matrix ) 、「 DETERM 」は行列式 ( determinant ) のことね。 もちろん、正方行列であれば別に2×2に限らず、もっと大きなものでも計算できるのよ。 |
![]() |
さて、ここでちょっと話がそれるけど、この後の内容と関係してくることだからちょっとガマンしてね。 こういう表計算ソフトには配列数式というものがあるんだけど、知っているかな? |
![]() |
んー・・・聞いたことがないですね。 |
![]() |
えっと、簡単に説明すると「一度にたくさんの計算ができて、答えも複数得られる機能」が配列数式なのよ。 といっても、これだけじゃ何のことやらサッパリだと思うから、実際の例を見ていきましょう。 |
![]() |
Aさんはこのような物を持ってコミケに行きました。さて、これが全部売れたらいくらになるかな? |
![]() |
えっと、普通に計算するならこうですね。 |
![]() |
そうだね。でもこれだと、項目の数が多くなってくると式がどんどん長くなっちゃうよね。 それに、後から列を追加したような場合には式を直さないといけないでしょ。 このくらいの表なら簡単だけど、 もっともっと大きな表を扱うときなんかは、どこの数字が抜けているかを探すだけでもけっこう大変だからね。 |
![]() |
でも、「 B2 * B3 、C2 * C3 、・・・と掛け算してからそれを全部足す」という計算だから、と思って こんな式を入れてみたら、なんだかヘンな答えになっちゃいました・・・ |
![]() |
そうね。 ここで注意したいのは、今出ている答えの「 50000 」。これは先頭の「 B2 * B3 」という計算の 答えになっているよね。 つまりこの「 =SUM((B2:F2)*(B3:F3)) 」という式は「 =SUM((B2)*(B3)) 」として 計算されているの。 これはなぜかといえば、「 * 」は掛け算をするという記号(積演算子)なんだけど、引数としては 単一の値やセル範囲しか取れないからなのね。 だから (B2:F2) や (B3:F3) みたいな「セルの範囲」を関数に渡しても 最初のひとつ以外は無視されちゃうの。 |
![]() |
ここで、式を入力したあと、Ctrl + Shiftを押しながらEnterで決定すると、
この写真のように数式全体が中かっこ( { } )で囲まれた形になるの。 これが配列数式というものね。 配列数式にすることで、普段なら単一の値やセルしか引数にとれなかった「 * 」がセルの範囲(配列)を引数にとることが できるようになっているわ。 だから「 (B2:F2)*(B3:F3) 」の部分で「 (B2*B3)、(C2*C3)、(D2*D3)、(E2*E3)、(F2*F3) 」 の答えをそれぞれ計算できて、 最後にそれを SUM 関数で足すことで正しい結果が得られるというわけ。 |
![]() |
なんだか難しいなぁ・・・でも面白そうですね。 |
![]() |
気をつけないといけないのは、式を入力するときにキーボードで直接中かっこを打っても配列数式とは認識されない、
ということね。 配列数式にするときは必ずCtrl + Shiftを押しながらEnterで決定しないとダメなのよ。 |
![]() |
もっとも、実際には「 SUMPRODUCT 」という関数が用意されていて、これを使えばこの手の計算はわざわざ
配列数式を使わなくてもできるんだけど・・・ もうちょっと、「配列数式らしい」例を見てみましょうか。 |
![]() |
こんな表があるとしましょう。3人の、5月の光熱水費の合計はいくらかな? もちろん、このくらいなら 「 =D3+D9+D15 」という式で計算できるけど、実際に仕事で表計算ソフトを使っていたりすると 何十人も何百人もある大きな表を扱うことになるし、内容(項目)の数ももっとずっと多くなるのが普通よね。 |
![]() |
人数が増えても表のつくり自体は同じ、という所にヒントがありそうですけど・・・? |
![]() |
その通り! 表を見ると、求めたい光熱水費が入っているのは3行目、9行目、15行目になっているね。 もしこのまま人数がどんどん増えて、表が下のほうに延びていったとしても6行ごとに問題の数値が 出てくることには変わりはないから、 そこに注目して値を拾っていくような式を作ればいいのよ。 |
![]() |
うわー、なんか見たこともないような式が出てきましたよ。 |
![]() |
確かに、いくつもの関数がネスト(関数の中にまた関数が入っていること)されているからちょっと複雑だけど、
落ち着いて考えてみましょう。 こういうときは、「内側から順に考える」のがセオリーね。 まずは ROW(D2:D19) の部分。ROW( ) はそのセルの行数を返す関数ね。 たとえば ROW(A1) = 1 だし、 ROW(D7) = 7 、といった感じね。 次に MOD(ROW(D2:D19),6 。これは 「 ROW(D2:D19) を計算して、その答えを6で割った余りを求める」という計算になるね。 |
![]() |
えーっと・・・「 ROW(D2:D19) 」は行の数になるんでしたよね。ということは答えは 2,3,4,5,6,7,8,9,・・・,18,19 、 になっているのかな? |
![]() |
そうね。 で、それを6で割った余りだから、 MOD(ROW(D2:D19),6 まで計算した時点での 答えは「 2,3,4,5,0,1,2,3,・・・,0,1 」という配列 になっているのは分かるかな? 今、欲しい値は3行目、9行目、15行目・・・つまり「行数 = 6n + 3 」( n = 0,1,2 ・・・) のところにあるわけだから、 行の数を6で割った余りが3になるところだけを拾うことで 問題の値が分かるというわけね。 |
![]() |
その余りを判定しているのが「 IF(MOD(ROW(D2:D19),6)=3,D2:D19,"") 」ですね。 |
![]() |
IF 文のルールは「条件判断、それが正しい場合の処理、それが間違っている場合の処理」ね。 (最初にステラが言っていたけど、OpenOffice Calc を使っている人はコンマの代わりにセミコロンを使ってね。) だからこの文は「 MOD(ROW(D2:D19),6 の結果が3なら、D2:D19 の値をそのまま使いなさい、 そうじゃないなら空白 (数字として扱う場合はゼロと同じこと)を使いなさい」ということになるわ。 結局、ここまで計算した結果は「 0,16800,0,0,0,0,0,21000,・・・,0,0 」という配列になっているのね。 |
![]() |
最後にそれを SUM で全部足すから、答えになるのかぁ・・・ |
![]() |
どうだったかな? こういうレベルなら、覚えておいても損はないと思うよ。 |
![]() |
わざわざ配列数式の計算について触れたのは、配列数式として入力しないと期待どおりの結果が返らない
関数があるからなの。 行列式の計算だけなら、答えはひとつの値になるからそんなもの必要なかったんだけど、 行列の積を計算しようとすると答えも行列になるよね。 つまり、複数の値が答えとして返ってくるわけだから これは必ず配列数式として入力しないといけないのよ。 |
![]() |
ここまでに出てきた話といえばあとは行列の積と、逆行列ですね。 |
![]() |
まずは、逆行列からね。 前のページで逆行列の話をしたときに、
の逆行列は という話をしたね。2×2の行列の逆行列は2×2の行列になるから、左の写真のように まず2×2のセル範囲を選択しておいて、そのまま右の写真のように打ち込むの。 関数「 MINVERSE 」が逆行列を求める関数で、さっき言ったとおり複数の値が答えとして返ってくる関数だから これは必ず配列数式として入力するのよ。 |
![]() |
お、ちゃんと答えになってますね。 |
![]() |
行列の積の計算も同じようにできるわ。 これも前のページで見た、 を計算してみましょう。答えが何行何列の行列になるかを考えて、それと同じ形のセル範囲を選択してから さっきと同じように配列数式で関数「 MMULT 」を入力すると・・・ |
![]() |
おおっ!ちゃんと答えになってる。 すごいですね〜配列数式。 |
![]() |
ただ、基本的にコンピュータは小数が苦手ということは覚えておいたほうがいいわ。 今の場合はたまたまいい感じの結果になったけど、割り切れない場合なんかは誤差が出てくることがあるからね。 詳しい話はまた、2進法の話なんかをする機会があればしようと思ってるけど・・・たとえば次の例を見てみて。 |
![]() |
上でも出てきたけど、前のページで の逆行列は
になるという話をしたよね。これはその積を Excel で計算してみたところなんだけど、1行2列目の成分がぴったり0にならずに 「 2.2204E-16 」という表示になっているよね。 つまり、「 3 * 0.4 + 2 * ( - 0.6 ) = 0.0000000000000022204 」 と計算されてしまうの。 パソコンに計算をしてもらう時には、こんな変な結果になることがあるから気をつけて。 まあ、なんでも機械まかせはよくない、って事かな。最後は自分でちゃんと確認しないとね。 |
![]() |
なるほどぉ〜。 |
![]() |
じゃあ、表計算ソフトを使った行列の基本的な計算の話はこれで終わり。 まあ、興味のある人はもっといろいろ調べたり試したりしてみてね。 |