Index: [Article Count Order] [Thread]

Date:  Sat, 2 Sep 95 15:15:01 JST
From:  Masanobu KOGA/古賀雅伸  <koga>
Subject:  Re: A question about CoMatrix 
To:  MaTX@mei.titech.ac.jp (MaTX ML)
Posted:  Sat, 02 Sep 1995 15:14:58 +0900
X-Mail-Count: 00041

古賀@東工大です。

>   藤井@山口大学と申します。
> 
>   compiler の動作についての質問です。

Complilerの動作原理に関わる難しい質問ですね。

>   CoMatrix として宣言した行列に、一度でも null matrix [] を
> 代入してしまうと、その先の処理では、もともとの行列を CoMatrix
> としては扱ってくれません。例えば
>
> >CoMatrix		C ;
> >Complex		tmp ;
> >
> >		read C ;
> >		if(condition A){
> >				C = [] ;
> >		}
> >		tmp = C(1,1) ;
> 
> とすると、compiler は 「tmp と C(1,1) では型があわないよ」という
> エラーメッセージを返して来ますが、C = [] ではお咎めなしです。

MaTXを使っている方で「CoMatrix宣言」を知っている人はあまり多くないと思います。
というのは,すべての行列の宣言は「Matrix宣言」を使えば良いからです。では,

  なぜ CoMatrix, PoMatrix, RaMatrix のような宣言があるのでしょうか?

次の2つのプログラムを使って理由を説明します。

------------------------------------------------------------
   Program-1         |       Program-2
------------------------------------------------------------
   afo.mm            |       afo2.mm
                     |
Func void afo()      |       Func void afo2()
{                    |       {
  Matrix a;          |         Matrix a;
  void foo();        |         void foo2();
                     |                           
  a = [1 2];         |         a = [(1,2), (3,4)];
  foo(a);            |         foo2(a);
}                    |       }
                     |
------------------------------------------------------------
   foo.mm            |       foo2.mm
                     |                           
Func void foo(a)     |       Func void foo2(a)
  Matrix a;          |         CoMatrix a;
{                    |       {
  print a(1,1);      |         print a(1,1);
}                    |       }
                     |
------------------------------------------------------------

Program-1は afo()で a に実行列を代入していますが,Program-2は afo2()
で a に複素行列を代入しています。そして,a を引数として foo() と foo2()
をそれぞれ呼び出しています。注意して欲しいのは,foo() では引数が Matrix
宣言されているのに,foo2() では CoMatrix 宣言されていることです。

もし,このCoMatrix宣言が無ければ,コンパイラは a(1,1) が複素数で
あることを知ることができないのです。(インタプリタなら分かります)
なぜなら,行列 a の実体(大きさ,型)は実行時にならないと決まらないからです。

行列だけの演算(和差積商など)しかないなら,行列の大きさや型による演算の違いは
クラスライブラリが引き受けてくれるので,CoMatrixのような宣言は必要ありません。

したがって,次の注意が必要になります。

 o 関数を定義するとき,あらかじめ引数の型が詳しく分かっているなら,
   その宣言をする。関数自身の型(戻り値)も同じ。

 o 条件分岐によって行列の型が変わる場合,型変換関数を使って型を
   指定する。

-----------------------------------------------------------------------------

それから,MaTX の null Matrix に関して補足しておきます。

null Matrix には
  real null matrix
  complex null matrix
  polynomial null matrix
  rational null matrix
の4種類があり,`` [] '' は real null matrix を意味します。

現在の MaTX には,real null matrix の記述法しかありませんから,
他の null matrix を入力するには,CoMatrix() や PoMatrix() など
の型変換関数を用いることになります。

結局,

>   これを回避するには C = CoMatrix([]) とすればいいのですが、

が答えになります。

--
古賀  雅伸
koga@mei.titech.ac.jp