(57)【要約】【課題】  オブジェクト指向プログラミング言語による演算子オーバーロードを利用した線形代数演算プログラミングにおいて，一時的なMatrixやVectorの配列要素が必要以上に生成されないようにする。【解決手段】  代数演算方法に、複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを備える。【選択図】  図１０
2007328692.tif 000002
【特許請求の範囲】
【請求項１】
複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、
前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、
前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを有することを特徴とする代数演算方法。
【請求項２】
前記代数演算変換工程において演算を１つの代数演算手順オブジェクトに変換できなければ、演算子の左オペランド又は右オペランドのオブジェクトについて前記評価工程を実行した後に、前記代数演算変換工程を実行することを特徴とする請求項１に記載の代数演算方法。
【請求項３】
前記オブジェクトアクセス用データは、配列用メモリ領域を所有している、配列所有オブジェクトへの参照と、積演算対象オブジェクトへの参照と、和演算対象オブジェクトへの参照とを有することを特徴とする請求項２に記載の代数演算方法。
【請求項４】
前記オブジェクト状態データは、自オブジェクトとの積演算を実行するための積演算用複素数オブジェクトと、前記和演算対象オブジェクトとの積演算を実行するための和演算用複素数オブジェクトとを含む複素数オブジェクト群と、自オブジェクトの代数状態を表すフラグ群と、他オブジェクトの代数状態を表すフラグ群と、自オブジェクトの計算状態を表すフラグ群とを有することを特徴とする請求項３に記載の代数演算方法。
【請求項５】
前記オブジェクトの代数状態を表すフラグ群は、オブジェクトがエルミート共役であるか否かを示すエルミート共役フラグと、オブジェクトの積演算対象オブジェクトがある場合に自オブジェクトがそのオブジェクトに対して左側から作用するか右側から作用するかを示す積演算順序フラグを有することを特徴とする請求項４に記載の代数演算方法。
【請求項６】
前記自オブジェクトの計算状態を表すフラグ群は、一時的に配列用メモリ領域を所有しているオブジェクトか否かを示す一時配列所有オブジェクトフラグと、評価が未完了か否かを示す未評価フラグを有することを特徴とする請求項４に記載の代数演算方法。
【請求項７】
前記代数演算変換工程は、前記オブジェクトアクセス用データをコピーし、前記オブジェクト状態データをコピーする複製生成工程を有することを特徴とする請求項６に記載の代数演算方法。
【請求項８】
前記代数演算変換工程は、前記複製生成工程により生成したオブジェクトの積演算用複素数オブジェクトと他複素数オブジェクトとの積演算を行い、その演算結果を該生成したオブジェクトの積演算用複素数オブジェクトに格納し、該生成したオブジェクトの前記和演算用複素数オブジェクトと他複素数オブジェクトとの積演算を行い、その演算結果を該生成したオブジェクトの和演算用複素数オブジェクトに格納し、前記未評価フラグを有効に設定する第１の積演算実行工程を有することを特徴とする請求項７に記載の代数演算方法。
【請求項９】
前記代数演算変換工程は、２項演算子のオペランドである２オブジェクトの一方の複製を前記複製生成工程により生成し、該生成したオブジェクトの有する積演算対象オブジェクトへの参照にもう一方のオブジェクトを設定し、該生成したオブジェクトの積演算用複素数オブジェクトともう一方のオブジェクトの積演算用複素数オブジェクトとの積演算を行ない、この結果を該生成したオブジェクトの積演算用複素数オブジェクトに格納し、前記積演算対象オブジェクトが有する自オブジェクトの代数状態を表すフラグ群を、自オブジェクトの積演算対象オブジェクトの代数状態を表すフラグ群に格納し、前記未評価フラグを有効にする第２の積演算実行工程を有することを特徴とする請求項７に記載の代数演算方法。
【請求項１０】
前記代数演算変換工程は、２項演算子のオペランドである２オブジェクトの一方の複製を前記複製生成工程により生成し、該生成したオブジェクトの有する前記和演算対象オブジェクトへの参照にもう一方のオブジェクトを設定し、該生成したオブジェクトの和演算用複素数オブジェクトにもう一方のオブジェクトの積演算用複素数オブジェクトを格納し、前記和演算対象オブジェクトが有する前記自オブジェクトの状態を表すフラグ群を、自オブジェクトが有する前記和演算対象オブジェクトの状態を表すフラグ群に格納し、前記未評価フラグを有効にすることを特徴とする、オブジェクト和演算実行工程を有することを特徴とする請求項７に記載の代数演算方法。
【請求項１１】
前記代数演算変換工程は、前記複製生成工程によりオブジェクトの複製を生成し、該生成したオブジェクトが有する自オブジェクトの代数状態フラグ群の前記エルミート共役フラグを反転し、自オブジェクトの前記積演算対象オブジェクトへの参照が設定されていれば、自オブジェクトの状態フラグ群の前記積演算順序フラグを反転させ、前記積演算用複素数オブジェクトを複素共役に変換し、自オブジェクトが有する積演算対象オブジェクトの代数状態フラグ群の前記エルミート共役フラグを反転し、自オブジェクトの前記和演算対象オブジェクトへの参照が設定されていれば、前記和演算用複素数オブジェクトを複素共役に変換し、自オブジェクトが有する和演算対象オブジェクトの代数状態フラグ群のエルミート共役フラグを反転させ、前記未評価フラグを有効にする、エルミート共役変換工程を有することを特徴とする請求項７に記載の代数演算プログラム。
【請求項１２】
前記評価工程は、前記オブジェクトの代数状態を表すフラグ群に含まれる積順序フラグが無効であれば、自オブジェクトが積演算の左側であり、前記積演算対象オブジェクトが積演算の右側となるように引数を設定して関数を実行し、前記積順序フラグが有効であれば、自オブジェクトが積演算の右側、積演算対象オブジェクトが積演算の左側となるように引数を設定して関数を実行する工程を有することを特徴とする請求項５に記載の代数演算方法。
【請求項１３】
前記評価工程は、評価対象のオブジェクトが自オブジェクトであれば、評価計算が完了した後に、該オブジェクトの計算状態を表すフラグ群の一時配列所有オブジェクトフラグを有効に設定し、前記積演算対象オブジェクト、前記和演算対象オブジェクト又は前記配列所有オブジェクトが一時的に生成されたオブジェクトであるか否かを、これらのオブジェクトが有するオブジェクトの計算状態を表すフラグ群の一時オブジェクトフラグにより判定し、該フラグが有効であれば、該オブジェクトの配列用メモリ領域を解放する工程を有することを特徴とする請求項６に記載の代数演算方法。
【請求項１４】
複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、該複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを記憶する記憶手段と、
前記複数オブジェクトに対する代数演算を、前記オブジェクトアクセス用データと前記オブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換手段と、
前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定手段と、
前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価手段とを有することを特徴とする代数演算装置。
【請求項１５】
コンピュータに、
複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、
前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、
前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを実行させることを特徴とするコンピュータ読み取り可能な代数演算プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算子をオーバーロードする機能を有したオブジェクト指向プログラミング言語で利用できる代数演算方法及びその装置に関するものである。
【背景技術】
【０００２】
従来、線形代数演算のプログラムを効率よく開発するために、C++等のオブジェクト指向プログラミング言語を使って、Matrix（行列）クラス、Vector（ベクトル）クラス、及びこれらをオペランドとする２項演算子を定義した線形代数プログラムやライブラリが利用されていた。
【０００３】
上記オブジェクト指向プログラミングによれば、例えば図１のようにC言語で書かれたプログラムは、C++言語による演算子のオーバーロードを使うと、図２のように記述できる（例えば、非特許文献１）。
【０００４】
演算子を定義（オーバーロード）することで、Matrix間の演算やMatrixによるVectorの変換も、添え字についてのループ処理を記述しないで、簡潔に記述することができる。
【０００５】
上記のオブジェクト指向プログラミングは、線形代数における数式との対応が直感的に分かるというメリットがあり、利用者にとっては、プログラムの作成とテストに要するコストが削減される。
【０００６】
一方、C言語やFortran言語による非オブジェクト指向プログラミング言語によるプログラミングでは、大規模高速な線形代数プログラミングのために線形代数ライブラリBLAS（非特許文献２参照）が利用されることが多い。
【非特許文献１】Bjarne Stroustrup : The C++ Programming Language. Addison-Wesley. 2000
【非特許文献２】URL：http://www.netlib.org/blas/
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、C++言語のオーバーロードを利用するMatrix及びVectorの演算は、通常、２項演算ごとに計算を完了する方式であるため、オーバーヘッドが大きくなりやすい。例えば、C=m*A*B+n*Cを計算する際に、図３に示すように、ステップ１からステップ６までの処理が行われる。
【０００８】
このため、C++言語のオーバーロードを利用する演算は、２項演算のたびに配列用のメモリ領域が確保されるので、メモリ使用効率がよくない。さらに、演算子からリターンされたオブジェクトを格納するための、コンパイラに自動生成されるオブジェクトまで考慮すると、一時的に生成されるオブジェクト数はさらに多くなる。
【０００９】
また、上記のようなプログラミングにおけるループ処理の数は、最低限必要なループ処理の数よりも明らかに大きい（図４）。これは、一度メモリから読み込んだデータを何度も読み込むことになり得るため、計算時間を増大させる原因となる。
【００１０】
上記非特許文献１もこのような問題を挙げている。その解決策としてW = M * V + X（W, V, X：Vector，Ｍ：Matrix）という演算に対しては，２つのオブジェクトへの参照をメンバ変数（属性）として持つ新たなクラスのオブジェクトをM*Vの演算の戻り値とするためにつくることを提案している。
【００１１】
しかし、この方法では、例えば、C = m * A * B + n * CやC = m * AH * B + n * Cのような一般的な演算には対応できない。ただし、AHはMatrix Aのエルミート共役を示す。また、C = m * A * B + n * C * (m * A * B + n * C)のように数式が長くなる場合における一時オブジェクトのメモリ領域が増大するという問題も残る。このように、従来技術は線形代数におけるあらゆる演算の種類について十分に対応できているわけではない。
【００１２】
一方、上述したBLASは，計算機のアーキテクチャに適したチューニングが施されて市販されていることも多いが，C++等のオブジェクト指向プログラミング言語に適したインターフェースでは提供されていない。
【００１３】
BLASでは，下記の式（１）のような演算は１つの関数を呼び出すだけで実現できるが，２項演算ごとに計算を完了させるオブジェクト指向プログラミングによる方法では，BLASのように１回の関数呼び出しで計算することはで困難である。ここで，A，B及びCはMatrixであり，α及びβは複素数である。
Ｃ＝αＡＢ＋βＣ      （１）
このため，C++等のオブジェクト指向プログラミング言語による演算子のオーバーロードを利用してBLAS相当の高速な線形代数演算プログラムを記述することはできなかった。
【００１４】
そこで、本発明の課題は，BLAS等を利用する非オブジェクト指向な線形代数演算プログラムと同等の性能（高速性）を，演算子を利用したオブジェクト指向プログラミング言語による線形代数演算プログラムでも実現できるようにすることである。
【課題を解決するための手段】
【００１５】
上記課題を解決するために、本発明によれば、代数演算方法に、複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを備える。
【００１６】
また、本発明の他の態様によれば、代数演算装置に、複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、該複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを記憶する記憶手段と、前記複数オブジェクトに対する代数演算を、前記オブジェクトアクセス用データと前記オブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換手段と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定手段と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価手段とを備える。
【００１７】
また、本発明の他の態様によれば、コンピュータ読み取り可能な代数演算プログラムにおいて、コンピュータに、複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを実行させることを特徴とする。
【発明の効果】
【００１８】
本発明によれば、オブジェクト指向プログラミング言語による代数演算を高速に実行することが可能となる。
【発明を実施するための最良の形態】
【００１９】
以下、添付図面を参照しながら、本発明の実施形態を説明する。
【００２０】
本実施形態は、以下の特徴を有する。
(1)  遅延評価プログラミングを取り入れ，実際に計算するタイミングを遅らせる。
(2)  オブジェクト間の演算をオブジェクト間の関連付けで完了できるようにする。
(3)  演算を行う際に，オペランドの引数のオブジェクトについて，その状態を判定することにより，その配列要素を更新するか否かを判定する。
(4)  演算過程で使用された後，不要になったオブジェクトの配列用メモリ領域は直ちに解放する。
【００２１】
本実施形態では，大規模な線形代数演算において，BLAS等の非オブジェクト指向プログラミング言語向けの高速演算ライブラリを直接利用することに比べ，十分無視できる程度のオーバーヘッドで演算子のオーバーロードを利用したプログラミングを実現できる。例えば，演算子オーバーロード等の，C++言語で記述することによるオーバーヘッドを十分無視できるC++言語対応版BLASが実現される。
【００２２】
例えば，以下のような演算について，計算過程で生成される一時的な配列用メモリ領域が必要ない（ただし，V，W：Vector，A，B，C：Matrix，m，n：Complex）。これはBLASを直接使って計算するような場合と同等である。
(a)    V = m * A * W + n * V
(b)    C = m * A * B + n * C
また，２項間演算を繰り返すことに伴う，一時メモリ領域へのメモリコピー等のオーバーヘッドの増加，必要メモリ量の増加を抑えることができる。
【００２３】
本実施形態の方法では，Matrixの要素及びVectorの成分の計算は先延ばしされるが，実際に計算が行なわれるタイミングは，オブジェクトが数１の右辺の形で表現できなくなる時，＝演算子が起動された時，及び，直ちに結果が必要となるメソッド（Dot，NormL2等）が実行された時である。
【００２４】
例えば，下記の式（２）の場合，先延ばしにされた演算の計算が実際に行なわれるのは，図５の１及び２の演算位置である。ただし，大文字のアルファベットはMatrixオブジェクトであり，小文字のアルファベットはComplexオブジェクトである。また，Trans()はエルミート共役に変換するメソッドである。
G=（m * A.Trans()*B+n*C）.Trans()*p*E+p*F      （２）
図６は、本実施形態に係る演算装置のハードウェア構成を示すブロック図である。
【００２５】
同図において、ＣＰＵ１０１は、フローチャートにつき説明した処理手順を含む各種プログラムを実行し、システムバス１０８により接続された装置各部を制御する。ＲＡＭ１０２は、データやプログラムを一時記憶する。ＲＯＭ１０３は、固定的なデータやプログラムを記憶する。キーボード１０４は、文字を入力したり、機能を選択するためのキーを備えている。更に画面上の位置を指示するためのポインティングデバイスとしてマウスが備えられている。
【００２６】
ディスプレイ１０５は、計算結果の数値やグラフを表示したり、ユーザインターフェース（ＵＩ）を提供する。ハードディスクドライブ（ＨＤＤ）１０６は、プログラムやデータを永続的に記憶装置である。更にＤＶＤ、ＣＤ、ＦＤなどの記憶媒体を用いる記憶装置を設けてもよい。通信Ｉ／Ｆ１０７は、ＬＡＮやインターネットなどを経由して装置外部と通信するためのインタフェースである。システムバス１０８は、上述した装置各部を接続し、装置間でデータやアドレス、制御信号を送受信する媒体として利用される。
【００２７】
フローチャートにつき説明した処理手順を含む各種プログラムは、ＲＯＭ１０３に記憶されていてもよいし、ＨＤＤ１０６からＲＡＭ１０２へ、処理に先立ってあるいは処理の実行中に必要に応じてロードされるようにしてもよい。
【００２８】
また、計算に必要なデータは、キーボード１０４から入力したり、ＨＤＤ１０６などの記憶装置から読み出したり、通信Ｉ／Ｆ１０７を介して外部から受信するなどして、得ることができる。
【００２９】
本実施形態では，オブジェクト指向プログラミング向けでないライブラリ，BLASを利用し，演算子のオーバーロードを使ったオブジェクト指向プログラミングでも利用できるようにする。
【００３０】
本実施形態における線形代数演算は，複素Matrix，複素Vectorに係わるものとする。また，Matrixは行数と列数が同じであるものとする。複素数の演算を実現するクラス（Complex）については説明しない。これについては，STL（Standard Template Library）のComplexクラス相当のものがあらかじめあるものとする。
【００３１】
図面はUML（Unified Modeling Language）の記法に従うものとする。特に，Class diagram，State machine diagram，及びActivity diagramを利用する。Activity daigramでは，プログラムとの対応を分かりやすくするため，C++のソースコードに近い記述を用いた。
【００３２】
図７は本実施形態におけるArrayクラス，Matrixクラス，及びVectorクラスの継承関係を説明するクラス図である。ただし，メソッドについては記載を省略している。ArrayクラスはMatrixクラスとVectorクラスに共通するメンバ変数とメソッドを持つ抽象的なクラスである。
【００３３】
Arrayクラスにおいて，pElmは配列要素のポインタを示す。NumElmは配列の長さを示す。RelationStateは，他オブジェクトとの関係を示す。MyArrayStateは自Arrayオブジェクトの状態を表す，MultiplyingArrayStateは積演算対象Arrayオブジェクトの状態を示す。AddingArrayStateは，和演算対象Arrayオブジェクトの状態を示す。ObjectStateはオブジェクトの状態を表す。Ownerは配列要素を所有しているArrayオブジェクトへの参照である。MultiplyingObjは積演算対象Arrayオブジェクトへの参照である。AddingObjは和演算対象オブジェクトへの参照である。“参照”は既にあるオブジェクトの別名であり，既にあるオブジェクトへのポインタとしてもよい。
【００３４】
MulFactorはマトリックスを以下の式（３）のように表した時の係数αである。AddFactorはマトリックスを以下の式（３）のように表した時の係数βである。
Ｄ＝αＡＢ＋βＣ      （３）
AssociatedCountは，そのオブジェクトを積演算対象としている他オブジェクトの数と和演算対象としている他オブジェクトの数の和である。
【００３５】
Matrixオブジェクトは最大１つまでの他Matrixオブジェクトを積演算対象オブジェクトとすることができる。Matrixオブジェクトは１つまでの他Matrixオブジェクトを和演算対象オブジェクトとすることができる。
【００３６】
Vectorオブジェクトは１つまでの他Vectorオブジェクトを積演算対象オブジェクトとすることができる。Vectorオブジェクトは１つまでの他Vectorオブジェクトを和演算対象オブジェクトとすることができる。自オブジェクトは自オブジェクトを積演算対象又は和演算対象とすることはできない。Vectorオブジェクトは１つまでのMatrixオブジェクトを積演算対象オブジェクトとすることができる。
【００３７】
Arrayオブジェクトは他Arrayオブジェクトの配列要素を利用することができる。この場合に利用するオブジェクトをUser，利用されるオブジェクトをOwnerと呼ぶこととする。積演算関係において，積演算をするオブジェクトをMultiplyingObj，積演算されるオブジェクトをMultipliedObjと呼ぶこととする。和演算関係においては，和演算をするオブジェクトをAddingObj，和演算されるオブジェクトをAddedObjと呼ぶこととする。Arrayオブジェクトは数３の右辺のような数式の形の情報を保持できる。Arrayクラスの属性との対応は以下のようになる。
α：MulFactor
β：AddFactor
Ａ：Owner
Ｂ：MultiplyingObj
Ｃ：AddingObj
ただし，MultiplyingObj＝０は積演算対象のオブジェクトがないこと，AddingObj＝０は和演算対象のオブジェクトがないこととして定義する。
【００３８】
図８は、Arrayクラスのオブジェクトの状態を表すメンバ変数RelationStateのとりうる値を示した図である。Arrayクラスのメンバ変数における型RelationTypeは、図８に示す値のいずれか一つを持つ変数型である。Arrayオブジェクトは、以下のいずれか１つの値をRelationStateの値として必ず持ち，それに対応する状態となっている。
【００３９】
図９は、Arrayクラスのオブジェクトの状態を表すビットの集合である変数の要素名とその意味を示した図である。図９の（Ａ）は、オブジェクトの状態を示すために必要な２つのフラグからなるArrayState型についての説明である。
【００４０】
フラグTranspseがON（ビット値が1）であれば、当該オブジェクトはエルミート共役であることを意味する。フラグMulReverseがOFFであれば，Ownerオブジェクトと積演算対象であるMultiplyingObjオブジェクトとの積演算において，Ownerオブジェクトは左側で，MultiplyingObjは右側となる（Owner＊MultiplyingObj）。MulReverseがONであればこの積演算の順序は入れ替わる（MultiplyingObj＊Owner）。
【００４１】
図９の（Ｂ）は、オブジェクトの状態を示すために必要な２つのフラグからなるObjectState型についての説明である。
【００４２】
TemporalOwnerがONであれば当該オブジェクトは一時的に配列用メモリ領域を所有しているオブジェクトである。この状態のオブジェクトの配列用メモリ領域は計算の過程で一時的に利用されるものであるため，利用された直後に当該メモリ領域を解放する。以下において，ObjectState.TemporalOwnerは単にTemporalOwnerと記載する。
【００４３】
UnEvaluatedがONであれば，当該オブジェクトは演算に対応する実際の計算が先延ばしされている。したがって，そのオブジェクトの要素（Matrixの成分又はVectorの成分）を参照する前に実際の計算を完了させる必要がある。以下において，ObjectState.UnEvaluatedは単にUnEvaluatedと記載する。
【００４４】
オブジェクトの状態を表すフラグをこのようにObjectStateとArrayStateに分けているのは，ArrayStateについては積演算又は和演算に伴って，積演算をする又は和演算をするオブジェクトが，積演算をされる又は和演算をされるオブジェクトの状態MyArrayStateをコピーし，保有する必要があるからである。一方，ObjectStateはコピーする必要はない。
【００４５】
図１０は、Arrayオブジェクトの状態変化を表すState Machine Diagramである。ただし，ここでの状態は，RelationStateとObjectStateの組合せ｛RelationState，ObjectState｝である。
【００４６】
大きさを指定してArrayオブジェクトを生成すると、初期状態｛RelationNormal，Evaluated｝という状態になる。この状態は他オブジェクトとの関係がない状態であり，ポインタpElmで示されるメモリ領域の内容をそのまま利用できる状態である。状態Evaluatedでは，ArrayオブジェクトのMulFactorは１，AddFactorは０，MultiplyingObj＝０，AddingObj＝０である。
【００４７】
状態｛RelationNormal，Evaluated｝は，multiplyFactor又はdivideFactorの操作により，状態｛RelationNormal，UnEvaluated｝になる。UnEvaluatedという状態は計算が完了していない状態である。したがって，真のオブジェクトの要素（Matrixの要素又はVectorの要素）が必要であれば，計算を完了させる必要があるということである。
【００４８】
状態｛RelationNormal，Evaluated｝において，makeRelationMultiplyの操作により状態｛Multiplying，UnEvaluated｝になる。これは，他オブジェクトを積演算対象としている状態であり，計算が完了していない状態である。状態｛RelationNormal，Evaluated｝において，makeRelationAddの操作により状態｛Adding，UnEvaluated｝になる。これは，他オブジェクトを和演算対象としている状態であり，計算が完了していない状態である。
【００４９】
状態｛RelationNormal，UnEvaluated｝において，multiplyFactor又はdivideFactorの操作により，状態｛RelationNormal，UnEvaluated｝へ戻る。状態｛RelationNormal，UnEvaluated｝において，makeRelationMultiplyにより状態｛Multiplying，UnEvaluated｝になる。状態｛RelationNormal，UnEvaluated｝において，makeRelationAddにより状態｛Adding，UnEvaluated｝になる。
【００５０】
状態｛Adding，UnEvaluated｝において，multiplyFactor又はdivideFactorの操作により，状態｛Adding，UnEvaluated｝へ戻る。
【００５１】
状態｛Multiplying，UnEvaluated｝において，makeRelationAddの操作により，状態｛MultiplyingAndAdding，UnEvaluated｝になる。状態｛MultiplyingAndAdding，UnEvaluated｝において，multplyFactor又はdivideFactorの操作により，状態｛MultiplyingAndAdding，UnEvaluated｝へ戻る。
【００５２】
状態｛MultipliedOrAdded，Evaluated｝を除いたすべての状態は、evaluate操作により状態｛RelationNormal，Evaluated｝になる。
【００５３】
状態｛RelationNormal，Evaluated｝において，他オブジェクトからsetMultiplyingObj又はsetAddingObjの操作がなされることにより，状態｛MultipliedOrAdded，Evaluated｝に戻る。
【００５４】
本実施の形態において使用するライブラリBLASの関数とその機能は図１１に示す通りである。これらの関数の詳細と関数の引数の詳細については非特許文献２に記載されている。また，本実施の形態では，Fortran言語形式の関数を直接呼び出すのではなく，C言語向けの関数CBLASを呼び出すものとする。CBLASはC言語からでもBLAS関数を利用しやすくするためのものであり，配列のメモリ上での配置の仕方を指定する引数があることを除いてBLASと同じである。もちろん，Fortran言語で作られたBLASのサブルーチンのオブジェクトを，引数に注意しながらリンケージさせることも可能であろう。
【００５５】
図１２はArrayクラスのメソッド（メンバ関数）の一覧を記載した図である。各メソッドの詳細は、図１５〜３９につき後述する。
【００５６】
図１３はMatrixクラスのメソッドの一覧を示した図である。各メソッドの詳細は、図４０〜６１につき後述する。
【００５７】
図１４はVectorクラスのメソッドの一覧を示した図である。各メソッドの詳細は、図６２〜８１につき後述する。
【００５８】
図１５は引数なしのArrayクラスのデフォルトコンストラクタについてのactivity diagramである。ステップＳ１５０１では，メソッドinitializeArrayを実行する。
【００５９】
図１６は、１つの整数（int型）を引数に持つArrayクラスのコンストラクタについてのActivity diagramである。本メソッドの引数は，int型変数in_NumElmである。これは配列の要素数である。ステップＳ１６０１では，メンバ変数にin_NumElmを設定し，メソッドinitializeArrayを実行する。
【００６０】
図１７は、Arrayオブジェクトへの参照を引数とするArrayクラスのコンストラクタについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。ステップＳ１７０１では，メソッドcopyArrayを引数argObjで実行する。
【００６１】
図１８は、Arrayクラスのデストラクタ~ArrayについてのActivity diagramである。
【００６２】
ステップＳ１８０１ではメソッドresetMultiplyingObjを実行し，メソッドresetAddingObjを実行する。ステップＳ１８０２では，メソッドisOwnerの戻り値がfalseであればステップＳ１８０３へ移行し，trueであればステップＳ１８０４へ移行する。
【００６３】
ステップＳ１８０３では配列要素の解放処理（freeMemory）を実行する。ステップＳ１８０４では，Ownerが０でなければステップＳ１８０５へ移行し，そうでなければ終了する。ステップＳ１８０５ではメソッドresetOwner（Owner−User関係のリセット）を実行する。
【００６４】
図１９は、Arrayオブジェクトを初期化するメソッドinitializeArrayについてのactivity diagramである。
【００６５】
ステップＳ１９０１では，RelationStateに値RelationNormalを設定する。ステップＳ１９０２では，MyArrayState，AddingArrayState及びMultiplyingArrayStateをリセットする。ここで，リセットするとはすべてのフラグをOFFに設定することである。
【００６６】
ステップＳ１９０３では，Ownerに０を設定し，pElmに０を設定する。ステップＳ１９０４ではMulFactorに値１を複素数として設定し，AddFactorに値０を複素数として設定する。ステップＳ１９０５ではMultiplyingObjに０を設定し，AddingObjに０を設定する。
【００６７】
図２０は配列要素のメモリ領域を確保するArrayクラスのメソッドgetMemoryについてのactivity diagramである。
【００６８】
ステップＳ２００１では，メソッドisOwnerの戻り値がfalseであればステップＳ２００２へ移行し，trueであれば終了する。ステップＳ２００２ではNumElmが０でなければステップＳ２００４へ移行し，０であればステップＳ２００３へ移行してエラー終了する。ステップＳ２００４ではOwnerが０でなければステップＳ２００５へ移行し，０であればステップＳ２００６へ移行する。
【００６９】
ステップＳ２００５ではメソッドresetOwnerを実行する。ステップＳ２００６では配列領域を確保する。これはMatrixの要素又はVectorの要素を格納するためのメモリ領域である。callocはメモリ領域を確保するシステムコールである。
【００７０】
ステップＳ２００７では，Ownerにthisを設定する。ただし，thisは自オブジェクトを指す識別子である。C++言語の場合，thisには自オブジェクトへのポインタが設定される仕様となっている。オブジェクトの参照であるOwnerにthisを設定するとは，Ownerのメンバ変数が自オブジェクトのそれを指すようにするということである。これは配列要素の所有者（Owner）が自オブジェクトであることを意味する。
【００７１】
図２１は、配列要素のためのメモリ領域を解放するArrayクラスのメソッドfreeMemoryについてのactivity diagramである。
【００７２】
ステップＳ２１０１では、メソッドisOwnerの戻り値がtrueであるかTemporalOwnerがONであれば（一時的な所有者であれば）、ステップＳ２１０２へ移行し，そうでなければ終了する。ステップＳ２１０２では、pElmを先頭アドレスとするメモリ領域を解放する。freeはメモリを解放するためのシステムコールである。
【００７３】
ステップＳ２１０３ではpElmに０を設定し，Ownerに０を設定する。ステップＳ２１０４ではTemporalOwnerをOFFに設定する。
【００７４】
図２２は，配列要素をコピーするArrayクラスのメソッドcopyElementについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
【００７５】
ステップＳ２２０１では，メソッドisOwnerの戻り値がfalseであればステップＳ２２０２へ移行し，trueであればステップＳ２２０３へ移行する。ステップＳ２２０２ではメソッドgetMemoryを実行する。ステップＳ２２０３では，コピー元のオブジェクトargObjの配列要素をすべて自オブジェクトの配列要素へとコピーする。
【００７６】
図２３は、Arrayオブジェクトのメンバ変数の一部をコピーするためのArrayオブジェクトのメソッドcopyArrayについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
【００７７】
ステップＳ２３０１で、コピー元ArrayオブジェクトargObjのメンバ変数NumElm，pElm，MulFactor及びAddFactorを自オブジェクトの対応するメンバ変数へコピーする。ステップＳ２３０２では，argObjのメンバ変数Ownerを自オブジェクトのOwnerにコピーする。これにより，自オブジェクトのOwnerがargObjのOwnerに一致する。
【００７８】
ステップＳ２３０３では，argObjのメンバ変数MyArrayStateを自オブジェクトのMyArrayStateにコピーする。ステップＳ２３０４では，argObjのメンバ変数MultiplyingObjが０でなければステップＳ２３０５へ移行し，０であればステップＳ２３０７へ移行する。
【００７９】
ステップＳ２３０５では、メソッドsetMultiplyingObjを引数argObj.MultiplyingObjで実行する。これにより，自オブジェクトのMultiplyingObjがコピー元オブジェクトargObjのMultiplyingObjに一致する。ステップＳ２３０６では、argObjのメンバ変数MultiplyingArrayStateを自オブジェクトのMultiplyingArrayStateにコピーする。
【００８０】
ステップＳ２３０７では、argObjのメンバ変数AddingObjが０でなければステップＳ２３０８へ移行し，０であれば終了する。ステップＳ２３０８では、メソッドsetAddingObjを引数argObj.AddingObjとして実行する。これにより，自オブジェクトのAddingObjがコピー元オブジェクトargObjのAddingObjに一致する。
【００８１】
ステップＳ２３０９では、argObjのメンバ変数AddingArrayStateを自オブジェクトのAddingArrayStateにコピーする。注意すべきことは，メソッドcopyArrayが配列要素（pElmを先頭アドレスとする連続したデータ）をコピーしないことである。配列要素をコピーするためにはメソッドcopyElementを実行する。
【００８２】
図２４は、Arrayオブジェクト（Matrixオブジェクト又はVectorオブジェクト）に対してComplexとの積演算を実行するためのメソッドmultiplyFactorについてのactivity diagramである。本メソッドの引数はComplexオブジェクトargFactorである。
【００８３】
ステップＳ２４０１ではMulFactorにargFactorを掛け，AddFactorにargFactorを掛ける。ステップＳ２４０２ではUnEvaluatedをONに設定する。
【００８４】
図２５は，Arrayオブジェクト（Matrixオブジェクト又はVectorオブジェクト）に対してComplexオブジェクトとの商演算を実行するためのメソッドdivideFactorについてのactivity diagramである。本メソッドの引数はComplexオブジェクトargFactorである。
【００８５】
ステップＳ２５０１ではMulFactorをargFactorで割り，AddFactorをargFactorで割る。ステップＳ２５０２ではUnEvaluatedをONに設定する。
【００８６】
図２６は、２つのArrayオブジェクトを積演算で関連付けするためのメソッドmakeRelationMultiplyについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
【００８７】
ステップＳ２６０１では，メソッドsetMultiplyingObjを引数argObjで呼び出す。ステップＳ２６０２では，自オブジェクトのMulFactorにargObjのMulFactorを掛ける。ステップＳ２６０３では，MultiplyingArrayStateにargObjのMyArrayStateを設定する。ステップＳ２６０４では，UnEvaluatedにONを設定する。
【００８８】
図２７は、２つのArrayオブジェクトを和演算で関連付けするメソッドmakeRelationAddのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
【００８９】
ステップＳ２７０１では、引数をargObj.OwnerとしてメソッドsetAddingObjを実行する。ステップＳ２７０２では、自オブジェクトのAddFactorにargObjのMulFactorを設定する。ステップＳ２７０３では自オブジェクトのAddingArrayStateにargObjのMyArrayStateを設定する。ステップＳ２７０４ではUnEvaluatedにONを設定する。
【００９０】
図２８は、２つのArrayオブジェクトの差を２オブジェクト間の関連付けで実現するメソッドmakeRelationSubtractについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
【００９１】
ステップＳ２８０１では、引数argObjでメソッドmakeRelationAddを実行する。ステップＳ２８０２では，自オブジェクトのAddFactorをComplex(-1.，0.)倍する。ここで，Complex(re，im)とは，実数部がre，虚数部がimの複素数オブジェクトである。ステップＳ２８０３ではUnEvaluatedにONを設定する。
【００９２】
図２９は，オブジェクトをエルミート共役に変換するメソッドmakeTransposeThisについてのactivity diagramである。
【００９３】
ステップＳ２９０１では，メソッドflipArrayStateを実行することにより，MyArrayStateのTransposeフラグを反転し，MulFactorからメソッドconjを実行することにより，MulFactorを複素共役に変換する。ステップＳ２９０２では， MultiplyingObjが０でなければステップＳ２９０３へ移行し，０であればステップＳ２９０４へ移行する。
【００９４】
ステップＳ２９０３では，メソッドflipArrayStateを実行することにより，MultiplyingArrayStateのTransposeフラグを反転し，メソッドflipArrayStateを実行することにより，MyArrayStateのMulReverseフラグを反転する。ステップＳ２９０４では，AddingObjが０でなければステップＳ２９０５へ移行し，０であればステップＳ２９０６へ移行する。
【００９５】
ステップＳ２９０５では，メソッドflipArrayStateを実行することにより，AddingArrayStateのTransposeフラグを反転し， AddFactorからメソッドconjを実行してAddFactorを複素共役に変換する。ステップＳ２９０６ではUnEvaluatedをONに設定する。
【００９６】
図３０は、Arrayオブジェクトの状態をリセットするためのメソッドresetArrayについてのactivity diagramである。
【００９７】
ステップＳ３００１ではRelationStateに値RelationNormalを設定する。ステップＳ３００２では，MyArrayState，AddingArrayState及びMultiplyingArrayStateをリセットする。ここで，リセットするとはすべてのフラグをOFFに設定することである。
【００９８】
ステップＳ３００３ではMulFactorにComplex(1.，0.)を設定し，AddFactorにComplex(0.，0.)を設定する。ステップＳ３００４ではメソッドresetMultiplyingAndAddingを実行する。
【００９９】
図３１は、引数のArrayオブジェクトを自オブジェクトの和演算対象に設定するためのメソッドsetAddingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
【０１００】
ステップＳ３１０１ではAddingObjにargObjを設定し，AddingObjのRelationStateに値MultipliedOrAddedを設定し，AddingObjのAssociatedCount値を１だけ加算する。ステップＳ３１０２では、自オブジェクトのRelationStateが値RelationNormalであればステップＳ３１０３へ移行し，値MultiplyingであればステップＳ３１０４へ移行する。
【０１０１】
ステップＳ３１０３では、自オブジェクトのRelationStateに値Addingを設定する。ステップＳ３１０４では自オブジェクトのRelationStateに値MultiplyingAndAddingを設定する。
【０１０２】
図３２は引数のArrayオブジェクトを自オブジェクトの積演算対象に設定するためのメソッドsetMultiplyingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
【０１０３】
ステップＳ３２０１では，自オブジェクトのMultiplyingObjにargObjを設定し，MultiplyingObjのRelationStateに値MultipliedOrAddedを設定し，MultiplyingObjのAssociatedCountの値を１だけ増加させ，自オブジェクトのRelationStateに値Multiplyingを設定する。
【０１０４】
図３３は、和演算対象のオブジェクトとの関係をリセットするためのメソッドresetAddingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
【０１０５】
ステップＳ３３０１では、AddingObjのAssociatedCountの値を１だけ減算する。ステップＳ３３０２では、AssociatedObjのAssociatedCountの値が０でればステップＳ３３０３へ移行し，そうでなければステップＳ３３０４へ移行する。
【０１０６】
ステップＳ３３０３では、AddingObjのRelationStateに値RelationNormalを設定する。ステップＳ３３０４では，自オブジェクトのAddingObjに０を設定する。ステップＳ３３０５では，自オブジェクトのRelationStateがAddingであればステップＳ３３０６へ移行し，値MultiplyingAndAddingであればステップＳ３３０７へ移行する。
【０１０７】
ステップＳ３３０６では，自オブジェクトのRelationStateに値RelationNormalを設定する。ステップＳ３３０７では，自オブジェクトのRelationStateに値Multiplyingを設定する。
【０１０８】
図３４は、積演算対象のオブジェクトとの関係をリセットするためのメソッドresetMultiplyingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
【０１０９】
ステップＳ３４０１では、MultiplyigObjのAssociatedCountの値を１だけ減算する。ステップＳ３４０２では、MultiplyingObjのAssociatedCountの値が０であればステップＳ３４０３へ移行し，そうでなければステップＳ３４０４へ移行する。
【０１１０】
ステップＳ３４０３では、MultiplyingObjのRelationStateに値RelationNormalを設定する。ステップＳ３４０４では、MultiplyingObjに０を設定する。ステップＳ３４０５ではRelationStateを判定する。RelationStateが値MultiplyingであればステップＳ３４０６へ移行し，値MultiplyingAndAddingであればステップＳ３４０７へ移行する。
【０１１１】
ステップＳ３４０６では、RelationStateに値RelationNormalを設定する。ステップＳ３４０７ではRelationStateに値Addingを設定する。
【０１１２】
図３５は、和演算対象のArrayオブジェクトとの和演算関係と積演算対象のArrayオブジェクトとの積演算関係をリセットするためのメソッドresetMultiplyingAndAddingObjについてのactivity diagramである。
【０１１３】
ステップＳ３５０１では，MultiplyingObjが０でなければステップＳ３５０２へ移行し，そうでなければステップＳ３５０３へ移行する。ステップＳ３５０２ではメソッドresetMultiplyingObjを実行する。ステップＳ３５０３では，AddingObjが０でなければステップＳ３５０４へ移行し，そうでなければ終了する。ステップＳ３５０４ではメソッドresetAddingObjを実行する。
【０１１４】
図３６は、配列要素の所有オブジェクト（Owner）と利用オブジェクト（User）の関係をリセットするために利用オブジェクトが呼び出すメソッドresetOwnerについてのactivity diagramである。ステップＳ３６０１ではOwnerに０を設定し，pElmに０を設定する。
【０１１５】
図３７は、自オブジェクトが配列要素の所有オブジェクトであるか否かを判定するためのメソッドisOwnerについてのactivity diagramである。
【０１１６】
ステップＳ３７０１では，Ownerがthis（自オブジェクト自身）でありpElmが０でなければステップＳ３７０２へ移行し，そうでなければステップＳ３７０３へ移行する。ステップＳ３７０２では戻り値trueでリターンする。ステップＳ３７０３では戻り値falseでリターンする。
【０１１７】
注意すべきことは，Ownerがthisであっても，pElmが０であれば戻り値falseでリターンすることである。つまり，isOwner()＝trueとは，Ownerに自オブジェクト自身（this）が設定されており，かつ，大きさが０より大きい配列用メモリ領域を有していることである。
【０１１８】
図３８は、Arrayの状態を表すフラグ群ArrayStateから指定したフラグ識別子のフラグを反転させるメソッドflipArrayStateのactivity diagramである。本メソッドの引数はArrayState型変数への参照とフラグ識別子（Transpose又はMulReverse）である。本メソッドはArrayStateの指定されたフラグを反転させる。
【０１１９】
ステップＳ３０８１では，引数のArrayStete型変数argStateについて，フラグ識別子argFlagのフラグがONであれば処理３８０２へ移行し，そうでなければ処理３８０３へ移行する。ステップＳ３８０２では当該フラグをOFFに設定する。ステップＳ３８０３では当該フラグをONに設定する。
【０１２０】
図３９は、計算の種類を分類するためにevaluateから利用されるメソッドgetEvaluationTypeについてのactivity diagramである。
【０１２１】
ステップＳ３９０１では、自オブジェクトがMatrixオブジェクトであればステップＳ３９０２へ移行し，そうでなければステップＳ３９１３へ移行する。ステップＳ３９０２ではMultiplyingObjが０でなければステップＳ３９０３へ移行し，そうでなければステップＳ３９１０へ移行する。
【０１２２】
ステップＳ３９０３では、MultiplyingObjがMatrixオブジェクトであればステップＳ３９０４へ移行し，そうでなければステップＳ３９０７へ移行する。ステップＳ３９０４ではAddingObjが０でなければステップＳ３９０５へ移行して戻り値MatA_Mul_MatB_Add_MatCでリターンし，そうでなければステップＳ３９０６へ移行して戻り値MatA_Mul_MatBでリターンする。
【０１２３】
ステップＳ３９０７では、AddingObjが０でなければステップＳ３９０８へ移行して戻り値MatA_Mul_VecX_Add_VecYでリターンし，そうでなければステップＳ３９０９へ移行して戻り値MatA_Mul_VecXでリターンする。
【０１２４】
ステップＳ３９１０では、AddingObjが０でなければステップＳ３９１１へ移行して戻り値ArrL_And_ArrRでリターンし，そうでなければステップＳ３９１２へ移行して戻り値EvaluationNormalでリターンする。ステップＳ３９１３ではMultiplyingObjが０でなければステップＳ３９１４へ移行し，そうでなければステップＳ３９２１へ移行する。
【０１２５】
ステップＳ３９１４では，MultiplyingObjがMatrixオブジェクトであればステップＳ３９１５へ移行し，そうでなければステップＳ３９１８へ移行する。ステップＳ３９１５では、AddingObjが０でなければステップＳ３９１６へ移行して戻り値VecX_Mul_MatA_Add_VecYでリターンし，そうでなければステップＳ３９１７へ移行して戻り値VecX_Mul_MatAでリターンする。
【０１２６】
ステップＳ３９１８では、AddingObjが０でなければステップＳ３９１９へ移行して戻り値VecX_Mul_VecY_Add_MatAでリターンし，そうでなければステップＳ３９２０へ移行して戻り値VecX_Mul_VecYでリターンする。ステップＳ３９２１では，AddingObjが０でなければステップＳ３９２２へ移行して戻り値ArrL_Add_ArrRでリターンし，そうでなければステップＳ３９２３へ移行して戻り値EvaluationNormalでリターンする。
【０１２７】
図４０は、MatrixクラスのデフォルトコンストラクタについてのActivity diagramである。
【０１２８】
ステップＳ４００１では、基底クラスのデフォルトコンストラクタArrayを実行する。C++ではこの基底クラスのコンストラクタの起動は暗黙に行なわれるので，プログラムでは記述する必要がない。ステップＳ４００２では、NxMaxに０を設定し，NyMaxに０を設定する。
【０１２９】
図４１は、２つの整数in_NxMaxとin_NyMaxとを引数として持つMatrixクラスのコンストラクタについてのActivity diagramである。
【０１３０】
ステップＳ４１０１では，引数in_NxMax*in_NyMaxで基底クラスのコンストラクタArrayを実行する。ステップＳ４１０２ではNxMaxにin_NxMaxを設定し，NyMaxにin_NyMaxを設定する。ステップＳ４１０３ではメソッドgetMemoryを実行する。
【０１３１】
図４２は、Matrixオブジェクトへの参照を引数として持つMatrixクラスのコンストラクタについてのActivity diagramである。ステップＳ４２０１では引数argObjでメソッドcopyArrayを実行する。ステップＳ４２０２では、NxMaxにargObjのメンバ変数NxMaxを設定し，NyMaxにargObjのメンバ変数NyMaxを設定する。
【０１３２】
図４３は、“Matrix＝Matrix”を実行するための＝演算子についてのActivity diagramである。ステップＳ４３０１では、引数argObjでメソッドevaluateを実行する。メソッドevaluateはargObjを評価して，結果を自オブジェクトに格納する。本演算子の実行により，先送りされた演算が実際に計算される。
【０１３３】
図４４は、“Matrix＊Matrix”を実行するための＊演算子についてのActivity diagramである。本演算子の引数は＊演算子の左オペランドLeftMatrixと右オペランドRightMatrixである。
【０１３４】
ステップＳ４４０１では、Matrixオブジェクトへの参照BaseObjにLeftMatrixを設定し，Matrixオブジェクトへの参照AssociatedObjにRightMatrixを設定する。ステップＳ４４０２ではBaseObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップＳ４４０３へ移行しそうでなければステップＳ４４０４へ移行する。
【０１３５】
ステップＳ４４０３では、BaseObjからメソッドevaluateを実行する。ステップＳ４４０４では、AssociatedObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップＳ４４０５へ移行し，そうでなければステップＳ４４０６へ移行する。
【０１３６】
ステップＳ４４０５では、AssociatedObjからメソッドevaluateを実行する（コピーコンストラクタによる生成）。ステップＳ４４０６では、引数BaseObjでMatrixオブジェクトResultObjを生成する。ステップＳ４４０７では、ResultObjからメソッドmakeRelationMultiplyを引数AssociatedObjで実行する。ステップＳ４４０８では戻り値ResultObjでリターンする。
【０１３７】
図４５は、“Complex＊Matrix”又は“Matrix＊Complex”を計算する＊演算子についてのactivity diagramである。本演算子の引数はComplexオブジェクトargComplex及びMatrixオブジェクトへの参照argMatrixである。ステップＳ４５０１では，argMatrixからメソッドmultiplyFactorを引数argComplexで実行する。
【０１３８】
図４６は、“Matrix／Complex”を実行する／演算子についてのactivity diagramである。本演算子の引数はComplexオブジェクトargComplex及びMatrixオブジェクトへの参照argMatrixである。ステップＳ４６０１では，argMatrixからメソッドdivideFactorを引数argComplexで実行する。
【０１３９】
図４７は、“Matrix＋Matrix”を実行する＋演算子についてのactivity diagramである。本演算子の引数は＋演算子の左オペランドLeftMatrixと右オペランドRightMatrixである。LeftMatrixとRightMatrixはMatrixオブジェクトへの参照である。
【０１４０】
ステップＳ４７０１では、RightMatrixのRelationStateが値MultiplyingであればステップＳ４７０２へ移行し，そうでなければステップＳ４７０３へ移行する。ステップＳ４７０２では，Matrixオブジェクトへの参照BaseMatrixにRightMatrixを設定し，Matrixオブジェクトへの参照，AssociatedMatrixにLeftMatrixを設定する。
【０１４１】
ステップＳ４７０３では，Matrixオブジェクトへの参照BaseMatrixにLeftMatrixを設定し，Matrixオブジェクトへの参照，AssociatedMatrixにRightMatrixを設定する。
【０１４２】
ステップＳ４７０４では，BaseMatrixのRelationStateが値RelationNormalでなく，値MultipliedOrAddedでなく，値MultiplyingでなければステップＳ４７０５へ移行し，そうでなければステップＳ４７０６へ移行する。
【０１４３】
ステップＳ４７０５では，BaseMatrixからメソッドevaluateを実行する。ステップＳ４７０６では，AssociatedMatrixのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップＳ４７０７へ移行し，そうでなければステップＳ４７０８へ移行する。
【０１４４】
ステップＳ４７０７では，AssociatedMatrixからメソッドevaluateを実行する。ステップＳ４７０８では，引数BaseMatrixでMatrixオブジェクトResultMatrixを生成する。ステップＳ４７０９では，ResultMatrixからメソッドmakeRelationAddを引数AssociatedMatrixで実行する。ステップＳ４７１０では，戻り値ResultMatrixでリターンする。
【０１４５】
図４８は“Matrix−Matrix”を実行する−演算子についてのactivity diagramである。本演算子の引数は−演算子の左オペランドLeftMatrixと右オペランドRightMatrixである。LeftMatrixとRightMatrixはMatrixオブジェクトへの参照である。
【０１４６】
ステップＳ４８０１では，swapフラグ(swap_flag)をOFFに初期化する。ステップＳ４８０２では，RightMatrixのRelationStateが値MultiplyingであればステップＳ４８０３へ移行し，そうでなければステップＳ４８０４へ移行する。
【０１４７】
ステップＳ４８０３では，BaseMatrixにRightMatrixを設定し，AssociatedMatrixにLeftMatrixを設定し，swap_flagにONを設定する。ステップＳ４８０４では，Matrixオブジェクトへの参照BaseMatrixにLeftMatrixを設定し，Matrixオブジェクトへの参照AssociatedMatrixにRightMatrixを設定する。
【０１４８】
ステップＳ４８０５では，BaseMatrixのRelationStateが値RelationNormalでなく，値MultipliedOrAddedでなく，値MultiplyingでなければステップＳ４８０６へ移行し，そうでなければステップＳ４８０７へ移行する。ステップＳ４８０６では，BaseMatrixからメソッドevaluateを実行する。ステップＳ４８０７では，AssociatedMatrixのRelationStateが値RelationNormalでなく，値MultipliedOrAddedでなければステップＳ４８０８へ移行し，そうでなければステップＳ４８０９へ移行する。
【０１４９】
ステップＳ４８０８では，AssociatedMatrixからメソッドevaluateを実行する。ステップＳ４８０９では，引数BaseMatrixでMatrixオブジェクトResultMatrixを生成する。ステップＳ４８１０では，ResultMatrixからメソッドmakeRelationSubtractを引数AssociatedMatrixで実行する。ステップＳ４８１１では，swapフラグがONであればステップＳ４８１２へ移行し，そうでなければステップＳ４８１３へ移行する。
【０１５０】
ステップＳ４８１２では，ResultMatrixからメソッドmultiplyFactorを引数Complex(-1.，0.)で実行する。これは，引き算の右側オペランドと左側オペランドを入れ替えたために必要となる。たとえば，βC-αA*Bという演算は，αA*B−βCとして処理した後に−１倍する。ステップＳ４８１３では戻り値ResultMatrixでリターンする。
【０１５１】
図４９は、Matrixクラスの単項演算子＋についてのactivity diagramである。ステップＳ４９０１では、引数thisでMatrixオブジェクトResultMatrixを生成する。ステップＳ４９０２では戻り値ResultMatrixでリターンする。
【０１５２】
図５０は、Matrixクラスの単項演算子−についてのactivity diagramである。
【０１５３】
ステップＳ５００１では、引数thisでMatrixオブジェクトResultMatrixを生成する。ステップＳ５００２では，ResultMatrixからメソッドmultiplyFactorを引数Complex(-1.，0.)で実行する。ステップＳ５００３ではResultMatrixのUnEvaluatedをONに設定する。ステップＳ５００４では戻り値ResultMatrixでリターンする。
【０１５４】
図５１は、Matrixオブジェクトをエルミート共役に変換するための関数Transのactivity diagramである。ステップＳ５１０１では，引数thisでMatrixオブジェクトResultMatrixを生成する。ステップＳ５１０２では，ResultMatrixからメソッドmakeTransposeThisを実行する。ステップＳ５１０３では，戻り値ResultMatrixでリターンする。
【０１５５】
図５２は、MatrixオブジェクトのL2ノルムを計算するためのメソッドNormL2についてのactivity diagramである。
【０１５６】
ステップＳ５２０１で、UnEvaluatedがONならばステップＳ５２０２へ移行し，そうでなければステップＳ５２０３へ移行する。ステップＳ５２０２ではメソッドevaluateを実行する。ステップＳ５２０３では、BLAS関数dznrm2を引数(NumElm,this,1)を呼び出し，その戻り値でリターンする。ただし，BLAS関数へ渡す引数のthisは，実際にはthisのメンバ変数pElmであるものとする。つまり，引数thisはthis.pElmを略記したものである。以降でも，BLAS関数の引数としてArrayオブジェクト（Matrixオブジェクト，Vectorオブジェクトを含む）を指定する場合は，実際にはオブジェクトのメンバ変数pElmを指定するものとする。
【０１５７】
図５３から図６０までは，計算を先延ばしされたMatrixオブジェクトの計算を実行するためのメソッドevaluateについてのactivity diagramである。本メソッドの引数はMatrixオブジェクトへの参照argObjである。
【０１５８】
ステップＳ５３０１では，ToBeRemovedOwnerに０を設定し，ToBeRemovedAddingObjに０を設定し，ToBeRemovedMultiplyingObjに０を設定する。ここで，ToBeRemovedOwner，ToBeRemovedAddingObj，ToBeRemovedMultiplyingObjはArrayオブジェクトへの参照である。また，ComplexオブジェクトTmpMulFactorにargObjのMulFactorを設定し，ComplexオブジェクトTmpAddFactorにargObjのAddFactorを設定し，Arrayオブジェクトへの参照TmpOwnerにargObjのOwnerを設定する。さらに，Arrayオブジェクトへの参照TmpAddingObjにargObjのAddingObjにargObjのAddingObjを設定し，Arrayオブジェクトへの参照TmpMultiplyingObjにargObjのMultiplyingObjを設定する。
【０１５９】
ステップＳ５３０２では，TmpOwnerが０でなくOwnerのTemporalOwnerがONであればステップＳ５３０３へ移行し，そうでなければステップＳ５３０４へ移行する。ステップＳ５３０３ではToBeRemovedOwnerにTmpOwnerを設定する。ステップＳ５３０４では、TmpAddingObjが０でなくTmpAddingObjのTemporalOwnerがONであればステップＳ５３０５へ移行し，そうでなければステップＳ５３０６へ移行する。
【０１６０】
ステップＳ５３０５では、ToBeRemovedAddingObjにTmpAddingObjを設定する。ステップＳ５３０６では、TmpMultiplyingObjが０でなくTmpMultiplyingObjのTemporalOwnerがONであればステップＳ５３０７へ移行し，そうでなければステップＳ５３０８へ移行する。ステップＳ５３０７では、ToBeRemovedMultiplyingObjにTmpMultiplyingObjを設定する。ステップＳ５３０８ではオブジェクトargObjからメソッドgetEvaluationTypeを実行し，戻り値をeval_typeに設定する。
【０１６１】
ステップＳ５３０９では、自オブジェクトthisがargObjに一致していればステップＳ５３１４へ移行し，そうでなければステップＳ５３１０へ移行する。ここで，「２つのオブジェクトが一致している」とは，２つオブジェクトが同じ実体を示していること，あるいは，２つのオブジェクトのメンバ変数が同じメモリ領域にあることを意味する。
【０１６２】
ステップＳ５３１０では，メソッドisOwnerの戻り値がfalseであればステップＳ５３１１へ移行し，そうでなければステップＳ５３１８へ移行する。ステップＳ５３１１では，TmpOwnerが０でなければステップＳ５３１２へ移行し，０ならばステップＳ５３１３へ移行する。ステップＳ５３１２では，自オブジェクトからメソッドresetOwnerを実行する。
【０１６３】
ステップＳ５３１３では，メソッドgetMemoryを実行し，フラグIsClearedをONに設定する。ステップＳ５３１４では，メソッドisOwnerの戻り値がfalseであればステップＳ５３１５へ移行し，そうでなければステップＳ５３１８へ移行する。ステップＳ５３１５ではTmpOwnerが０でなければステップＳ５３１６へ移行し，そうでなければステップＳ５３１７へ移行する。
【０１６４】
ステップＳ５３１６では、自オブジェクトからメソッドresetOwnerを実行する。ステップＳ５３１７では，メソッドgetMemoryを実行し，フラグIsClearedをONに設定し，TemporalOwnerをONに設定する。
【０１６５】
ステップＳ５３１８では、eval_typeがArrL_add_ArrRであればステップＳ５４１０へ移行し，VecX_mul_VecYであればステップＳ５６０６へ移行し，VecX_mul_VecY_add_MatAであればステップＳ５６０９へ移行する。また、eval_typeがMatA_mul_MatBであればステップＳ５７０１へ移行し，MatA_mul_MatB_add_MatCであればステップＳ５８０１へ移行し，EvaluationNormalであればステップＳ６００１へ移行する。
【０１６６】
ステップＳ５４０１では、ToBeRemovedOwnerが０でなければステップＳ５４０２へ移行し，そうでなければステップＳ５４０３へ移行する。ステップＳ５４０２では、ToBeRemovedOwnerからメソッドfreeMemoryを実行する。ステップＳ５４０３では、ToBeRemovedAddingObjが０でなければステップＳステップＳ５４０４へ移行し，そうでなければステップＳ５４０５へ移行する。
【０１６７】
ステップＳ５４０４では、ToBeRemovedAddingObjからメソッドfreeMemoryを実行する。ステップＳ５４０５では、ToBeRemovedMultiplyingObjが０でなければステップＳ５４０６へ移行し，そうでなけばステップＳ５４０７へ移行する。ステップＳ５４０６ではToBeRemovedMultiplyingObjからメソッドfreeMemoryを実行する。
【０１６８】
ステップＳ５４０７では、自オブジェクトからメソッドresetMatrixを実行し，UnEvaluatedにOFFを設定する。ステップＳ５４０８では，argObjがthisに一致すればステップＳ５４０９へ移行し，そうでなければ終了する。ステップＳ５４０９では，オブジェクトargObjからresetMatrixを実行し，argObjのUnEvaluatedにOFFを設定する。
【０１６９】
ステップＳ５４０１からステップＳ５４０９までの処理により，例えば下記の式（４）のような右辺の長い数式をプログラムとして記述した場合であっても，一時的に生成されるMatrixオブジェクト又はVectorオブジェクトの配列用メモリ領域は，高々２つまでしか生成されない。従来技術では，このような場合，積演算（＊）の数に比例して配列用メモリ領域が増大する。
M = A * B * C * D * E * F * G * H;      （４）
下記の式（５）のような和演算（＋）においても同様に，一時的に生成される配列用メモリ領域は高々２つである。
M = A + B + C + D + E + F + G + H;      （５）
ステップＳ５４１０では，オブジェクトargObj.MyArrayState.TransposeフラグがOFFである場合、argObj.AddingArrayState.TransposeフラグがOFFであればステップＳ５５０１へ移行し，argObj.AddingArrayState.TransposeフラグがONであればステップＳ５５０６へ移行する。一方、ステップＳ５４１０でargObj.MyArrayState.TransposeフラグがONである場合、argObj.AddingArrayState.TransposeフラグがOFFであればステップＳ５５１３へ移行し，argObj.AddingArrayState.TransposeフラグがONであればステップＳ５６０１へ移行する。
【０１７０】
ステップＳ５５０１では，TmpOwnerがthis（自オブジェクト）でなくTmpAddingObjがthisでなければステップＳ５５０２へ移行し，TmpOwnerがthisでありTmpAddingObjがthisであればステップＳ５５０３へ移行する。また，TmpOwnerがthisでありTmpAddingObjがthisでなければステップＳ５５０４へ移行し，TmpOwnerがthisでなくTmpAddingObjがthisであればステップＳ５５０５へ移行する。
【０１７１】
ステップＳ５５０２では、BLAS関数zaxpyを引数(NumElm，TmpMulFactor，TmpOwner， 1， this， 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，TmpAddingObj， 1， this， 1)で呼び出し，ステップＳ５４０１へ移行する。ここで，BLAS関数の引数のComplexオブジェクトは，実際には，Complexオブジェクトのメンバ変数（実数部，虚数部）の先頭のアドレスであるものとする。以降においても，BLAS関数の引数にComplexオブジェクトを指定する場合は，同じ意味の略記であるものとする。
【０１７２】
ステップＳ５５０３では、ComplexオブジェクトSumFactorにTmpAddFactorとTmpMulFactorの和を設定し，BLAS関数zscalを引数(NumElm，SumFactor， this, 1)で呼び出し，ステップＳ５４０１へ移行する。ステップＳ５５０４では，BLAS関数zscalを引数(NumElm，TmpMulFactor， this, 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，TmpAddingObj， 1， this， 1)で呼び出し，ステップＳ５４０１へ移行する。
【０１７３】
ステップＳ５５０５では，BLAS関数zscalを引数(NumElm，TmpAddFactor， this, 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpMulFactor，TmpOwner， 1， this， 1)で呼び出し，ステップＳ５４０１へ移行する。ステップＳ５５０６では、TmpOwnerがthisでなくTmpAddingObjがthisでなければステップＳ５５０７へ移行し，そうでなければステップＳ５５０８へ移行する。
【０１７４】
ステップＳ５５０７では、メソッドgetTransを引数TmpAddingObjで実行し，BLAS関数zscalを引数（NumElm，TmpAddFactor，this，1）で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpMulFactor，TmpOwner，1，this，1)で呼び出し，ステップＳ５４０１へ移行する。ここで，getTransはMatrix又はVectorについて，そのエルミート共役なものの要素を実際に計算するメソッドである。
【０１７５】
ステップＳ５５０８では、MatrixオブジェクトｔMatrixを引数（NxMax，NyMax）で生成し，ｔMatrixオブジェクトからメソッドgetTransを引数TmpAddingObjで実行する。ステップＳ５５０９では，TmpOwnerがthisであればステップＳ５５１０へ移行し，そうでなければステップＳ５５１１へ移行する。
【０１７６】
ステップＳ５５１０では、BLAS関数zscalを引数(NumElm，TmpMulFactor， this, 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，tMatrix， 1， this， 1)で呼び出す。ステップＳ５５１１では、BLAS関数zcopyを引数（NumElm，ｔMatrix，this，1）で呼び出し，BLAS関数zscalを引数（NumElm，TmpAddFactor，this，1）で呼び出し，BLAS関数zaxpyを引数（NumElm，TmpMulFactor，TmpOwner，1，this，1）で呼び出す。
【０１７７】
ステップＳ５５１２ではtMatrixを消去し、ステップＳ５４０１へ移行する。C++言語におけるオブジェクトの消去はdelete演算子で実現できる。ステップＳ５５１３では、TmpOwnerがthisでなくTmpAddingObjがthisでなければステップＳ５５１４へ移行し，そうでなければステップＳ５５１５へ移行する。
【０１７８】
ステップＳ５５１４では、メソッドgetTransを引数TmpOwnerで実行し，BLAS関数zscalを引数（NumElm，TmpMulFactor，this，1）で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，TmpAddingObj，1，this，1)で呼び出し，ステップＳ５４０１へ移行する。
【０１７９】
ステップＳ５５１５では、MatrixオブジェクトｔMatrixを引数（NxMax，NyMax）で生成し，ｔMatrixオブジェクトからメソッドgetTransを引数TmpAddingObjで実行する。ステップＳ５５１６では，TmpAddingObjがthisであればステップＳ５５１７へ移行し，そうでなければステップＳ５５１８へ移行する。
【０１８０】
ステップＳ５５１７では、BLAS関数zscalを引数(NumElm，TmpAddFactor，this,1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpMulFactor，tMatrix，1，this，1)で呼び出す。ステップＳ５５１８では、BLAS関数zcopyを引数（NumElm，ｔMatrix，1，this，1）で呼び出し，BLAS関数zscalを引数（NumElm，TmpMulFactor，this，1）で呼び出し，BLAS関数zaxpyを引数（NumElm TmpAddFactor，TmpAddingObj，1，this，1）で呼び出す。
【０１８１】
ステップＳ５５１９では、オブジェクトtMatrixを消去し，ステップＳ５４０１へ移行する。ステップＳ５６０１では、MatrixオブジェクトｔMatrixを引数（NxMax，NyMax）で生成する。ステップＳ５６０２では、TmpOwnerがthisでありTmpAddingObjがthisであればステップＳ５６０３へ移行し，そうでなければステップＳ５６０４へ移行する。
【０１８２】
ステップＳ５６０３では，ｔMatrixからメソッドgetTransを引数TmpOwnerで実行し，ComplexオブジェクトSumFactorにTmpMulFactorとTmpAddFactorの和を設定し，BLAS関数zaxpyを引数(NumElm，SumFactor，tMatrix，1，this，1)で呼び出す。ステップＳ５６０４では、BLAS関数zaxpyを引数(NumElm，TmpMulFactor，TmpOwner，1，this，1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，TmpAddingObj，1，this，1)で呼び出す。ステップＳ５６０５ではオブジェクトtMatrixを消去し，ステップＳ５４０１へ移行する。
【０１８３】
ステップＳ５６０６では、argObjのMulReverseがONであればステップＳ５６０７へ移行し，そうでなければステップＳ５６０８へ移行する。ここで，MulReverseがOFFになるのは，argObj.MyArrayState.TransposeがOFFであり，argObj.MultiplyingArrayState.TransposeがONとなる場合のみである。またMulReverseがONになるのは、argObj.MyArrayState.TransposeがONでありargObj.MultiplyingArrayState.TransposeがOFFとなる場合のみである。
【０１８４】
ステップＳ５６０７では、BLAS関数zgercを引数(CblasRowMajor，Nx，Nx，TmpMulFactor，TmpOwner，1，TmpMultiplyingObj，1，this，Nx)で呼び出す。ここで，引数のNxはNxMaxを略記したものである。以降においてもBLAS関数の引数についてNxMaxをNxと略記する。ここで，CblasRowMajorは配列のメモリ上での配置の仕方を指定する引数である。ステップＳ５６０８では、BLAS関数zgercを引数(CblasRowMajor，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，1，TmpOwner，1，this，Nx)で呼び出す。
【０１８５】
ステップＳ５６０９では、BLAS関数zcopyを引数(NumElm，TmpAddingObj，1，this，1)で呼び出す。ステップＳ５６１０では、argObjのMulReverseがOFFであればステップＳ５６１１へ移行し，そうでなければステップＳ５６１２へ移行する。ここで，MulReverseがOFFになるのは，argObj.MyArrayState.TransposeがOFFであって，argObj.MultiplyingArrayState.TransposeがONとなる場合のみである。またMulReverseがONになるのはargObj.MyArrayState.TransposeがONでありargObj.MultiplyingArrayState.TransposeがOFFとなる場合のみである。
【０１８６】
ステップＳ５６１１では，BLAS関数zgercを引数(CblasRowMajor，Nx，Nx，TmpMulFactor，TmpOwner，1，TmpMultiplyingObj，1，this，Nx)で呼び出す。ステップＳ５６１２では、BLAS関数zgercを引数(CblasRowMajor，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，1，TmpOwner，1，this，Nx)で呼び出す。
【０１８７】
ステップＳ５７０１では、内部フラグInnerGetMemoryをOFFに設定する。ステップＳ５７０２では、TmpOwnerがthisであるか，又は，TmpMultiplyingObjがthisであればステップＳ５７０３へ移行し，そうでなければステップＳ５７０４へ移行する。
【０１８８】
ステップＳ５７０３では、MatrixオブジェクトｔMatrixを引数（NxMax，NyMax）で生成し，フラグInnerGetMemoryにONを設定する。ステップＳ５７０４では，Matrixオブジェクトへの参照ｔMatrixにthisを設定する。ステップＳ５７０５では，argObjのMulReverseがtrueであればステップＳ５７０６へ移行し，そうでなければステップＳ５７０７へ移行する。
【０１８９】
ステップＳ５７０６は、BLAS関数zgemmを引数（CblasRowMajor，argObj.MyArrayState.Transpose，argObj.MultiplyingArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，Nx，TmpAddFactor，this，Nx）で呼び出す。
【０１９０】
ステップＳ５７０７では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，argObj.MyArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，Nx，TmpOwner，Nx，TmpAddFactor，this，Nx)で呼び出す。
【０１９１】
ステップＳ５７０８では、フラグInnerGetMemoryがONであればステップＳ５７０９へ移行し，そうでなければステップＳ５４０１へ移行する。ステップＳ５７０９ではBLAS関数zcopyを引数(NumElm，tMatrix，1，this，1)で呼び出し，オブジェクトtMatrixを消去する。
【０１９２】
ステップＳ５８０１では，TmpAddingObjのTransposeがONであればステップＳ５９０６へ移行し，そうでなければステップＳ５８０２へ移行する。ステップＳ５８０２では，thisがTmpAddingObjであればステップＳ５９０１へ移行し，そうでなければステップＳ５８０３へ移行する。ステップＳ５８０３では，TmpOwnerがthisであるか，又は，TmpMultiplyingObjがthisであればステップＳ５８０４へ移行し，そうでなければステップＳ５８０９へ移行する。
【０１９３】
ステップＳ５８０４では、MatrixオブジェクトｔMatrixを引数（NxMax，NyMax）で生成し，BLAS関数zcopyを引数(NumElm，this，1，tMatrix，1)で呼び出す。ステップＳ５８０５では、thisのMulReverseがtrueであればステップＳ５８０６へ移行し，そうでなければステップＳ５８０７へ移行する。
【０１９４】
ステップＳ５８０６では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MultplyingArrayState.Transpose，argObj.MyArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpMultiplying，Nx，TmpOwner，Nx，TmpAddFactor，tMatrix，Nx)で呼び出す。
【０１９５】
ステップＳ５８０７では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MyArrayState.Transpose，argObj.MultiplyingArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，Nx，TmpAddFactor，tMatrix，Nx)で呼び出す。
【０１９６】
ステップＳ５８０８では，BLAS関数zcopyを引数(NumElm，tMatrix，1，this，1)で呼び出し，ステップＳ５４０１へ移行する。ステップＳ５８０９ではthisのMulReverseがtrueであればステップＳ５８１０へ移行し，そうでなければステップＳ５８１１へ移行する。
【０１９７】
ステップＳ５８１０では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，argObj.MyArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpMultiplying，Nx，TmpOwner，Nx，TmpAddFactor，this，Nx)で呼び出す。
【０１９８】
ステップＳ５８１１では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MyArrayState.Transpose，argObj.MultiplyingArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，Nx，TmpAddFactor，this，Nx)で呼び出す。
【０１９９】
ステップＳ５９０１では、MatrixオブジェクトｔMatrixを引数（NxMax：int，NyMax：int）のコンストラクタで生成し，BLAS関数zcopyを引数(NumElm，TmpAddingObj，1，tMatrix，1)で呼び出す。ステップＳ５９０２ではthisのMulReverseがONであればステップＳ５９０３へ移行し，そうでなければステップＳ５９０４へ移行する。
【０２００】
ステップＳ５９０３では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，argObj.MyArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpMultiplying，Nx，TmpOwner，Nx，TmpAddFactor，tMatrix，Nx)で呼び出す。
【０２０１】
ステップＳ５９０４では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MyArrayState.Transpose，argObj.MultiplyingArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，Nx，TmpAddFactor，tMatrix，Nx)で呼び出す。ステップＳ５９０５では、BLAS関数zcopyを引数(NumElm，tMatrix，1，this，1)で呼び出し、ステップＳ５４０１へ移行する。
【０２０２】
ステップＳ５９０６では、MatrixオブジェクトｔMatrixを引数（NxMax：int，NyMax：int）のコンストラクタで生成し，ｔMatrixからメソッドTransを引数TmpAddingObjで実行する。ステップＳ５９０７ではthisのMulReverseがONであればステップＳ５９０８へ移行し，そうでなければステップＳ５９０９へ移行する。
【０２０３】
ステップＳ５９０８では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，argObj.MyArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpMultiplying，Nx，TmpOwner，Nx，TmpAddFactor，tMatrix，Nx)で呼び出す。
【０２０４】
ステップＳ５９０９では、BLAS関数zgemmを引数(CblasRowMajor，argObj.MyArrayState.Transpose.Transpose，argObj.MultiplyingArrayState.Transpose，Nx，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，Nx，TmpAddFactor，tMatrix，Nx)で呼び出す。ステップＳ５９１０では、BLAS関数zcopyを引数(NumElm，tMatrix，1，this，1)で呼び出し、ステップＳ５４０１へ移行する。
【０２０５】
ステップＳ６００１では、argObjのTransposeがONであればステップＳ６００５へ移行し，そうでなければステップＳ６００２へ移行する。ステップＳ６００２では，thisがTmpOwnerであればステップＳ６００３へ移行し，そうでなければステップＳ６００４へ移行する。
【０２０６】
ステップＳ６００３では、BLAS関数zscalを引数（NumElm，TmpMulFactor，this，1）で呼び出す。ステップＳ６００４ではBLAS関数zaxpyを引数（NumElm，TmpMulFactor，TmpOwner，1，this，1）で呼び出す。ステップＳ６００５では、argObjがthisであればステップＳ６００８へ移行し，そうでなければステップＳ６００６へ移行する。
【０２０７】
ステップＳ６００６では、引数argObjでMatrixオブジェクトworkMatrixを生成し，フラグInnerGetMemoryをONに設定する。ステップＳ６００７ではworkMatrixからメソッドcopyElementを実行する。ステップＳ６００８では、workMatrixをtMatrixの参照として定義し，フラグInnerGetMemoryをOFFに設定する。ステップＳ６００９では自オブジェクトからメソッドgetTransを引数workMatrixで実行する。
【０２０８】
ステップＳ６０１０では、BLAS関数zscalを引数（NumElm，TmpMulFactor，this，1）で呼び出す。ステップＳ６０１１では、フラグInnerGetMemoryがONであればステップＳ６０１２へ移行しそうでなければ，ステップＳ５４０１へ移行する。ステップＳ６０１２では、オブジェクトworkMatrixを消去し，ステップＳ５４０１へ移行する。
【０２０９】
図６１は、計算を先延ばしされたMatrixオブジェクトの計算を実行するための、引数なしのメソッドevaluateについてのactivity diagramである。ステップＳ６１０１では引数thisでメソッドevaluateを実行する。
【０２１０】
図６２は、引数なしのVectorクラスのデフォルトコンストラクタについてのactivity diagramである。ステップＳ６２０１では，基底クラスのデフォルトコンストラクタArrayを実行する。C++ではこの基底クラスのコンストラクタの起動は暗黙に行なわれるので，プログラムでは記述する必要はない。ステップＳ６２０２では，NxMaxに０を設定する。
【０２１１】
図６３は、１つの整数（int型）を引数に持つVectorクラスのコンストラクタについてのactivity diagramである。ステップＳ６３０１では，引数in_NxMaxで基底クラスのコンストラクタArrayを実行する。ステップＳ６３０２では，NxMaxに引数in_NxMaxを設定する。ステップＳ６３０３ではメソッドgetMemoryを実行する。
【０２１２】
図６４は、Vectorオブジェクトへの参照argObjを引数として持つVectorクラスのコンストラクタについてのactivity diagramである。ステップＳ６４０１では、引数argObjで基底クラスのコンストラクタArrayを実行する。ステップＳ６４０２ではNxMaxにargObjのNxMaxを設定する。
【０２１３】
図６５は、演算“Vector＝Vector”を実現するための＝演算子についてのactivity diagramである。ステップＳ６５０１では、引数argObjでメソッドevaluateを実行する。メソッドevaluateはargObjを評価して，結果を自オブジェクトに格納する。
【０２１４】
図６６は、演算“Matrix＊Vector”を行なうための＊演算子についてのactivity diagramである。
【０２１５】
ステップＳ６６０１では、Matrixオブジェクトへの参照BaseObjにLeftObjを設定し，Matrixオブジェクトへの参照AssociatedObjにRightObjを設定する。ステップＳ６６０２では、BaseObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップＳ６６０３へ移行し，そうでなければステップＳ６６０４へ移行する。
【０２１６】
ステップＳ６６０３では、BaseObjからメソッドevaluateを実行する。ステップＳ６６０４では、AssociatedObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップＳ６６０５へ移行し，そうでなければステップＳ６６０６へ移行する。
【０２１７】
ステップＳ６６０５では、AssociatedObjからメソッドevaluateを実行する。ステップＳ６６０６では、BaseObjを引数としてVectorクラスのオブジェクトResultObjを生成する。ステップＳ６６０７では、ResultObjからメソッドmakeRelationMultiplyを引数AssociatedObjで実行する。ステップＳ６６０８では戻り値ResultObjでリターンする。
【０２１８】
図６７は、演算“Complex＊Vector”又は演算“Vector＊Complex”を計算する＊演算子のactivity diagramである。ステップＳ６７０１ではメソッドmultiplyFactorを引数argComplexで実行する。
【０２１９】
図６８は、演算“Vector／Complex”を計算する／演算子のactivity diagramである。ステップＳ６８０１では、メソッドdivideFactorを引数argComplexで実行する。
【０２２０】
図６９は、演算“Vector＋Vector”を計算する＋演算子についてのactivity diagramである。
【０２２１】
ステップＳ６９０１では、RightVectorのRelationStateが値MultiplyingであればステップＳ６９０２へ移行し、そうでなければステップＳ６９０３へ移行する。
【０２２２】
ステップＳ６９０２では、Vectorオブジェクトへの参照BaseVectorにRightVectorを設定し，Vectorオブジェクトへの参照AssociatedVectorにLeftVectorを設定する。ステップＳ６９０３では、Vectorオブジェクトへの参照BaseVectorにLeftVectorを設定し，Vectorオブジェクトへの参照AssociatedVectorにRightVectorを設定する。
【０２２３】
ステップＳ６９０４では、BaseVectorのRelationStateが値RelationNormalでなく，値MultipliedOrAddedでなく，値MultiplyingでなければステップＳ６９０５へ移行し，そうでなければステップＳ６９０６へ移行する。ステップＳ６９０５ではBaseVectorからメソッドevaluateを実行する。
【０２２４】
ステップＳ６９０６では、AssociatedVectorのRelationStateが値RelationNormalでなく，値MultipliedOrAddedでなければステップＳ６９０７へ移行し，そうでなければステップＳ６９０８へ移行する。ステップＳ６９０７では、AssociatedVectorからメソッドevaluateを実行する。ステップＳ６９０８では、引数BaseVectorでVectorオブジェクトResultObjを生成する。
【０２２５】
ステップＳ６９０９では、ResultObjからメソッドmakeRelationAddを引数AssociatedVectorで実行する。ステップＳ６９１０では戻り値ResultObjでリターンする。
【０２２６】
図７０は、演算“Vector−Vector”を計算するための−演算子についてのactivity diagramである。
【０２２７】
ステップＳ７００１では、swapフラグ（swap_flag）をOFFで初期化する。ステップＳ７００２では、RightVectorのRelationStateが値MultiplyingであればステップＳ７００３へ移行し，そうでなければステップＳ７００４へ移行する。
【０２２８】
ステップＳ７００３では、BaseVectorにRightVectorを設定し，AssociatedVectorにLeftVectorを設定し，swapフラグにONを設定する。ステップＳ７００４では、Vectorオブジェクトへの参照BaseVectorにLeftVectorを設定し，Vectorオブジェクトへの参照AssociatedVectorにRightVectorを設定する。
【０２２９】
ステップＳ７００５では、BaseVectorのRelationStateが、値RelationNormalでなく，値MultipliedOrAddedでなく，値MultiplyingでもなければステップＳ７００６へ移行し，そうでなければステップＳ７００７へ移行する。ステップＳ７００６では、BaseVectorからメソッドevaluateを実行する。ステップＳ７００７では、AssociateObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでもなければステップＳ７００８へ移行し，そうでなければステップＳ７００９へ移行する。
【０２３０】
ステップＳ７００８では、AssociatedVectorからメソッドevaluateを実行する。ステップＳ７００９では、引数BaseVectorでVectorオブジェクトResultObjを生成する。ステップＳ７０１０では、ResultObjからメソッドmakeRelationSubtractを引数AssociatedVectorで実行する。
【０２３１】
ステップＳ７０１１では、swapフラグがONであればステップＳ７０１２へ移行し，そうでなければステップＳ７０１３へ移行する。ステップＳ７０１２では、ResultObjからメソッドmultiplyFactorを引数Complex(-1.，0.)で実行する。ステップＳ７０１３では戻り値ResultObjでリターンする。
【０２３２】
図７１は、Vectorクラスの単項演算子＋についてのactivity diagramである。ステップＳ７１０１では、引数thisでVectorオブジェクトResultVectorを生成する。ステップＳ７１０２では、戻り値ResultVectorでリターンする。
【０２３３】
図７２は、Vectorクラスの単項演算子−についてのactivity diagramである。ステップＳ７２０１では、引数thisでVectorオブジェクトResultVectorを生成する。ステップＳ７２０２では、ResultVectorからメソッドmultiplyFactorを引数Complex(-1.，0.)で実行する。ステップＳ７２０３では、ResultVectorのUnEvaluatedをONに設定する。ステップＳ７２０４では戻り値ResultVectorでリターンする。
【０２３４】
図７３は、Vectorオブジェクトをエルミート共役に変換するメソッドTransについてのactivity diagramである。ステップＳ７３０１では、引数thisでVectorオブジェクトResultVectorを生成する。ステップＳ７３０２では、ResultVectorからメソッドmakeTransposeThisを実行する。ステップＳ７３０３では、戻り値ResultVectorでリターンする。
【０２３５】
図７４は、VectorオブジェクトのL2ノルムを計算するメソッドNormL2についてのactivity diagramである。
【０２３６】
ステップＳ７４０１では、UnEvaluatedがONならばステップＳ７４０２へ移行し，そうでなければステップＳ７４０３へ移行する。ステップＳ７４０２ではメソッドevaluateを実行する。ステップＳ７４０３では，BLAS関数dznrm2を引数(NumElm,this,1)で呼び出し，この戻り値でリターンする。
【０２３７】
図７５は、Vectorオブジェクトの内積を計算するメソッドDoｔについてのactivity diagramである。本メソッドの引数は２つのVectorオブジェクトへの参照，LeftVector及びRightVectorである。
【０２３８】
ステップＳ７５０１では、LeftVectorのUnEvaluatedがONであればステップＳ７５０２へ移行し，そうでなければステップＳ７５０３へ移行する。ステップＳ７５０２では、LeftVectorからメソッドevaluateを実行する。ステップＳ７５０３では、RightVectorのUnEvaluatedがONであればステップＳ７５０４へ移行し，そうでなければステップＳ７５０５へ移行する。
【０２３９】
ステップＳ７５０４では、RightVectorからメソッドevaluateを実行する。ステップＳ７５０５では、BLAS関数zdotu_sumを引数(NumElm，LeftVector，1，RightVector，1，ReturnValue)で実行し，戻り値ReturnValueでリターンする。
【０２４０】
図７６から図８０までは、計算を先延ばしされたMatrixオブジェクトの計算を実行するためのメソッドevaluateについてのactivity diagramである。本メソッドの引数はVectorオブジェクトへの参照argObjである。
【０２４１】
ステップＳ７６０１では，ToBeRemovedOwnerに０を設定し，ToBeRemovedAddingObjに０を設定し，ToBeRemovedMultiplyingObjに０を設定する。ここで，ToBeRemovedOwner，ToBeRemovedAddingObj，ToBeRemovedMultiplyingObjはArrayオブジェクトへの参照である。さらに，ComplexオブジェクトTmpMulFactorにargObjのMulFactorを設定し，ComplexオブジェクトTmpAddFactorにargObjのAddFactorを設定し，Arrayオブジェクトへの参照TmpOwnerにargObjのOwnerを設定し，Arrayオブジェクトへの参照TmpAddingObjにargObjのAddingObjにargObjのAddingObjを設定し，Arrayオブジェクトへの参照TmpMultiplyingObjにargObjのMultiplyingObjを設定する。
【０２４２】
ステップＳ７６０２では、オブジェクトargObjのTmpOwnerが０でなくargObjのTmpOwnerのTemporalOwner値がONであればステップＳ７６０４へ移行し，そうでなければステップＳ７６０３へ移行する。ステップＳ７６０３ではToBeRemovedTmpOwnerにargObjのTmpOwnerを設定する。ステップＳ７６０４では、argObjのTmpAddingObjが０でなくargObjのTmpAddingObjのTemporalOwner値が０NであればステップＳ７６０５へ移行し，そうでなければステップＳ７６０６へ移行する。
【０２４３】
ステップＳ７６０５では、ToBeRemovedTmpAddingObjにargObjのTmpAddingObjを設定する。ステップＳ７６０６では、argObjのTmpMultiplyingObjが０でなくargObjのTmpMultiplyingObjのTemporalOwner値が０NであればステップＳ７６０７へ移行し，そうでなければステップＳ７６０８へ移行する。
【０２４４】
ステップＳ７６０７では、ToBeRemovedTmpMultiplyingObjにargObjのTmpMultiplyingObjを設定する。ステップＳ７６０８では、argObjからメソッドgetEvaluationTypeを呼び出し，戻り値をeval_typeに設定する。ステップＳ７６０９では、自オブジェクト（this）がargObjに一致していればステップＳ７６１１へ移行し，そうでなければステップＳ７６１４へ移行する。
【０２４５】
ステップＳ７６１０では、メソッドisTmpOwnerの戻り値がfalseであればステップＳ７６１１へ移行し，そうでなければステップＳ７６１８へ移行する。ステップＳ７６１１では、Onwerが０でなければステップＳ７６１２へ移行し，そうでなければステップＳ７６１３へ移行する。ステップＳ７６１２では，メソッドresetTmpOwnerを実行する。ステップＳ７６１３では，メソッドgetMemoryを実行し，フラグIsClearedにONを設定する。
【０２４６】
ステップＳ７６１４では，メソッドisTmpOwnerの戻り値がfalseであればステップＳ７６１５へ移行し，そうでなければステップＳ７６１８へ移行する。ステップＳ７６１５では、Onwerが０でなければステップＳ７６１６へ移行し，そうでなければステップＳ７６１７へ移行する。ステップＳ７６１６ではメソッドresetTmpOwnerを実行する。ステップＳ７６１７では、メソッドgetMemoryを実行し，フラグIsClearedにONを設定し，TemporalOwnerにONを設定する。
【０２４７】
ステップＳ７６１８では，eval_typeが値ArrL_Add_ArrRであればステップＳ７８０１へ移行し，値MatA_Mul_VecXであればステップＳ７８０６へ移行し，値MatA_Mul_VecX_Add_VecYであればステップＳ７９０１へ移行し，値EvaluationNormalであればステップＳ８００１へ移行する。
【０２４８】
ステップＳ７７０１では，ToBeRemovedTmpOwnerが０でなければステップＳ７７０２へ移行し，そうでなければステップＳ７７０３へ移行する。ステップＳ７７０２では、オブジェクトToBeRemovedTmpOwnerからメソッドfreeMemoryを実行する。ステップＳ７７０３では，ToBeRemovedTmpAddingObjが０でなければステップＳ７７０４へ移行し，０であればステップＳ７７０５へ移行する。
【０２４９】
ステップＳ７７０４では，ToBeRemovedTmpAddingObjからメソッドfreeMemoryを実行する。ステップＳ７７０５では、ToBeRemovedTmpMultiplyingObjが０でなければステップＳ７７０６へ移行し，０であればステップＳ７７０７へ移行する。ステップＳ７７０６では，ToBeRemovedTmpMultiplyingObjからメソッドfreeMemoryを実行する。
【０２５０】
このように，メモリ解放を実行することにより，数式が長くなった場合でも，配列要素を格納するためのメモリ領域の大きさが一定以上にならないようにする。ここで，C++の場合，このタイミングで一時オブジェクトを消去（delete）できないことに注意する。これは，一時的なオブジェクトの消去は，コンパイラによって，数式の最後の位置（セミコロンの直前）で実行されるためである。
【０２５１】
ステップＳ７７０７では、メソッドresetVectorを実行した後，UnEvaluatedをOFFに設定する。ステップＳ７７０８では、argObjがthisでなければステップＳ７７０９へ移行し，そうでなければ終了する。ステップＳ７７０９では、argObjからメソッドresetVectorを実行し，argObjのUnEvaluatedをOFFに設定する。
【０２５２】
ステップＳ７８０１では，TmpOwnerがthisでなくTmpAddingObjがthisでなければステップＳ７８０２へ移行し，TmpOwnerがthisでありTmpAddingObjがthisであればステップＳ７８０３へ移行する。またTmpOwnerがthisでありTmpAddingObjがthisでなければステップＳ７８０４へ移行し，TmpOwnerがthisでなくTmpAddingObjがthisであればステップＳ７８０５へ移行する。
【０２５３】
ステップＳ７８０２では、BLAS関数zaxpyを引数(NumElm，TmpMulFactor，TmpOwner， 1， this， 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，TmpAddingObj， 1， this， 1)で呼び出す。
【０２５４】
ステップＳ７８０３では、ComplexオブジェクトSumFactorにTmpAddFactorとTmpMulFactorの和を設定し，BLAS関数zscalを引数(NumElm，SumFactor， this, 1)で呼び出す。
【０２５５】
ステップＳ７０８４では，BLAS関数zscalを引数(NumElm，TmpMulFactor， this, 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpAddFactor，TmpAddingObj， 1， this， 1)で呼び出す。
【０２５６】
ステップＳ７０８５では，BLAS関数zscalを引数(NumElm，TmpAddFactor， this, 1)で呼び出し，BLAS関数zaxpyを引数(NumElm，TmpMulFactor，TmpOwner， 1， this， 1)で呼び出す。
【０２５７】
このようにいくつかの処理に分ける理由は，例えば，自オブジェクト（this），TmpAddingObj及びTmpOwnerが同じオブジェクトであったような場合に，係数SumFactorを計算し，自オブジェクトの各配列要素をSumFactor倍する方が，２オブジェクトの各要素を足し合わせるよりも一般的に速いからである。
【０２５８】
ステップＳ７８０６では、thisがTmpAddingObj又はTmpMultiplyingObjであればステップＳ７８０７へ移行し，そうでなければステップＳ７８０８へ移行する。ステップＳ７８０７では、VectorクラスのオブジェクトｔVectorを引数BaseObjのコンストラクタで生成する。ステップＳ７８０８ではｔVectorをinputVectorの参照として定義する。
【０２５９】
ステップＳ７８０９では、inputVectorのMulReverseがOFFであればステップＳ７８１０へ移行し，そうでなければステップＳ７８１１へ移行する。
【０２６０】
ステップＳ７８１０では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MyArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，1，TmpAddFactor，tVector，1)で呼び出す。
【０２６１】
ステップＳ７８１１では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，Nx，TmpOwner，1，TmpAddFactor，tVector，1)で呼び出す。
【０２６２】
ステップＳ７９０１では、thisがTmpAddingObjであればステップＳ７７０１へ移行し，そうでなければステップＳ７９０２へ移行する。ステップＳ７９０２では、thisがTmpOwnerであるか又はthisがTmpMultiplyingObjであればステップＳ７９０３へ移行し，そうでなければステップＳ７９０８へ移行する。
【０２６３】
ステップＳ７９０３では、VectorオブジェクトｔVectorをデフォルトコンストラクタで生成し，BLAS関数zcopyを引数(NumElm，this，1，tVector，1)で呼び出す。ステップＳ７９０４では、inputVectoｒのMulReverseがOFFであればステップＳ７９０５へ移行し，そうでなければステップＳ７９０６へ移行する。
【０２６４】
ステップＳ７９０５では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，Nx，TmpOwner，1，TmpAddFactor，tVector，1)で呼び出す。
【０２６５】
ステップＳ７９０６では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MyArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，1，TmpAddFactor，tVector，1)で呼び出す。
【０２６６】
ステップＳ７９０７では、BLAS関数zcopyを引数(NumElm，tMatrix，1，this，1)で呼び出し，ステップＳ７７０１へ移行する。ステップＳ７９０８ではinputVectorのMulReverseがOFFならばステップＳ７９０９へ移行し，そうでなければステップＳ７９１０へ移行する。
【０２６７】
ステップＳ７９０９では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MyArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，1，TmpAddFactor，this，1)で呼び出し，ステップＳ７７０１へ移行する。
【０２６８】
ステップＳ７９１０では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，Nx，TmpOwner，1，TmpAddFactor，this，1)で呼び出し，ステップＳ７７０１へ移行する。
【０２６９】
ステップＳ７９１１では、VectorオブジェクトｔVectorをデフォルトコンストラクタ生成し，BLAS関数zcopyを引数(NumElm，this，1，tVector，1)で呼び出す。ステップＳ７９１２では、inputVectorのMulReverseがOFFならばステップＳ７９１３へ移行し，そうでなければステップＳ７９１４へ移行する。
【０２７０】
ステップＳ７９１３では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MyArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpOwner，Nx，TmpMultiplyingObj，1，TmpAddFactor，this，1)で呼び出し，ステップＳ７７０１へ移行する。
【０２７１】
ステップＳ７９１４では、BLAS関数zgemvを引数(CblasRowMajor，argObj.MultiplyingArrayState.Transpose，Nx，Nx，TmpMulFactor，TmpMultiplyingObj，Nx，TmpOwner，1，TmpAddFactor，this，1)で呼び出し，ステップＳ７７０１へ移行する。
【０２７２】
ステップＳ８００１では、TmpOwnerがthisであればステップＳ８００２へ移行し，そうでなければステップＳ８００３へ移行する。ステップＳ８００２では、BLAS関数zscalを引数(NumElm，tMatrix.TmpMulFactor，this，1)で呼び出す。ステップＳ８００３では、BLAS関数zaxpyを引数(NumElm，tMatrix.TmpMulFactor，TmpOwner，1，this，1)で呼び出す。
【０２７３】
図８１は、演算が先延ばしされたVectorオブジェクトの演算を完了させるための引数なしのメソッドevaluateについてのactivity diagramである。ステップＳ８１０１では引数thisでメソッドevaluateを実行する。
【０２７４】
以上説明した実施形態によれば、ComplexオブジェクトmとMatrixオブジェクトの積演算では，ComplexオブジェクトmとMatrixオブジェクトが有するComplexオブジェクトのメンバ変数との積演算を実行する。Matrixオブジェクト間の積演算及び和演算では、オブジェクト間の関連付けを行って実際の演算を先延ばしし，代入演算の実行時にまとめて計算を実行する。
【０２７５】
これにより、オブジェクト指向プログラミング言語による演算子オーバーロードを利用した線形代数演算を高速に実行することができる。
【０２７６】
なお、本発明は、複数の機器から構成されるシステムに適用しても、一つの機器からなる装置に適用してもよい。
【０２７７】
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体が供給されたシステムあるいは装置のコンピュータが、そのプログラムコードを読み出し実行することでも達成される。
【０２７８】
この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。また、コンピュータが読み出したプログラムコードの指示に基づき、コンピュータ上で稼働しているオペレーティングシステムなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれる。
【０２７９】
さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張カードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれる場合がある。そのプログラムコードの指示に基づき、その機能拡張カードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部または全部を行うことで前述した実施形態の機能が実現される場合も本発明に含まれる。
【図面の簡単な説明】
【０２８０】
【図１】C言語で記述したプログラムの例の図である。
【図２】C++言語で記述したプログラムの例の図である。
【図３】従来技術における一時オブジェクトの生成を示した図である。
【図４】従来技術における演算方法と最も簡単な演算方法を対比した図である。
【図５】長い数式において，線型代数演算が実際に実行されるタイミングを示した図である。
【図６】実施形態における演算装置のハードウェア構成を示す図である。
【図７】Arrayクラス，Matrixクラス，Vectorクラスの継承関係を説明する図である。
【図８】Arrayクラスのオブジェクトの状態を表すメンバ変数RelationStateのとりうる値を示した図である。
【図９】Arrayクラスのオブジェクトの状態を表すビットの集合である変数の要素名とその意味を示した図である。
【図１０】Arrayクラスのオブジェクトの状態遷移を示した図である。
【図１１】実施形態で利用するBLASライブラリの関数名を示した図である。
【図１２】Arrayクラスのメソッドの一覧を示した図である。
【図１３】Matrixクラスのメソッドの一覧を示した図である。
【図１４】Vectorクラスのメソッドの一覧を示した図である。
【図１５】Arrayクラスのデフォルトコンストラクタにおいて実行される処理を示す図である。
【図１６】Arrayクラスのint型を引数とするコンストラクタにおいて実行される処理を示す図である。
【図１７】Arrayクラスの，Arrayオブジェクトの参照を引数とするコンストラクタにおいて実行される処理を示す図である。
【図１８】Arrayクラスのデストラクタにおいて実行される処理を示す図である。
【図１９】ArrayクラスのメソッドinitializeArrayで実行される処理を示す図である。
【図２０】ArrayクラスのメソッドgetMemoryで実行される処理を示す図である。
【図２１】ArrayクラスのメソッドfreeMemoryで実行される処理を示す図である。
【図２２】ArrayクラスのメソッドcopyElementで実行される処理を示す図である。
【図２３】ArrayクラスのメソッドcoppyArrayで実行される処理を示す図である。
【図２４】ArrayクラスのメソッドmultiplyFactorで実行される処理を示す図である。
【図２５】ArrayクラスのメソッドdivideFactorで実行される処理を示す図である。
【図２６】ArrayクラスのメソッドmakeRelationMultiplyで実行される処理を示す図である。
【図２７】ArrayクラスのメソッドmakeRelationAddで実行される処理を示す図である。
【図２８】ArrayクラスのメソッドmakeRelationSubtractで実行される処理を示す図である。
【図２９】ArrayクラスのメソッドmakeTransposeThisで実行される処理を示す図である。
【図３０】ArrayクラスのメソッドresetArrayで実行される処理を示す図である。
【図３１】ArrayクラスのメソッドsetAddingObjで実行される処理を示す図である。
【図３２】ArrayクラスのメソッドsetMultiplyingObjで実行される処理を示す図である。
【図３３】ArrayクラスのメソッドresetAddingObjで実行される処理を示す図である。
【図３４】ArrayクラスのメソッドresetMultiplyingObjで実行される処理を示す図である。
【図３５】ArrayクラスのメソッドresetMultiplyingAndAddingObjで実行される処理を示す図である。
【図３６】ArrayクラスのメソッドresetOwnerで実行される処理を示す図である。
【図３７】ArrayクラスのメソッドisOwnerで実行される処理を示す図である。
【図３８】ArrayクラスのメソッドflipArrayStateで実行される処理を示す図である。
【図３９】ArrayクラスのメソッドgetEvaluationTypeで実行される処理を示す図である。
【図４０】Matrixクラスのデフォルトコンストラクタで実行される処理を示す図である。
【図４１】Matrixクラスのint型変数２つを引数とするコンストラクタで実行される処理を示す図である。
【図４２】Matrixクラスの，Matrixオブジェクトの参照を引数とするコンストラクタで実行される処理を示す図である。
【図４３】Matrixクラスの＝演算子（代入演算子）で実行される処理を示す図である。
【図４４】“Matrixオブジェクト＊Matrixオブジェクト”を演算する＊演算子で実行される処理を示す図である。
【図４５】“Complexオブジェクト＊Matrixオブジェクト”又は“Matrixオブジェクト＊Complexオブジェクト”を演算する＊演算子で実行される処理を示す図である。
【図４６】“Matrixオブジェクト／Complexオブジェクト”を演算する／演算子で実行される処理を示す図である。
【図４７】“Matrixオブジェクト＋Matrixオブジェクト”を演算する＋演算子で実行される処理を示す図である。
【図４８】“Matrixオブジェクト−Matrixオブジェクト”を演算する−演算子で実行される処理を示す図である。
【図４９】Matrixクラスの単項演算子＋で実行される処理を示す図である。
【図５０】Matrixクラスの単項演算子−で実行される処理を示す図である。
【図５１】MatrixクラスのメソッドTransで実行される処理を示す図である。
【図５２】MatrixクラスのメソッドNormL2で実行される処理を示す図である。
【図５３】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図５４】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図５５】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図５６】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図５７】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図５８】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図５９】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図６０】Matrixクラスの，Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図６１】Matrixクラスの，引数なしのメソッドevaluateで実行される処理を示す図である。
【図６２】Vectorクラスのデフォルトコンストラクタで実行される処理を示す図である。
【図６３】Vectorクラスのint型変数２つを引数とするコンストラクタで実行される処理を示す図である。
【図６４】Vectorクラスの，Vectorオブジェクトの参照を引数とするコンストラクタで実行される処理を示す図である。
【図６５】Vectorクラスの＝演算子（代入演算子）で実行される処理を示す図である。
【図６６】“Matrixオブジェクト＊Vectorオブジェクト”を演算する＊演算子で実行される処理を示す図である。
【図６７】“Complexオブジェクト＊Vectorオブジェクト”又は“Vectorオブジェクト＊Complexオブジェクト”を演算する＊演算子で実行される処理を示す図である。
【図６８】“Vectorオブジェクト／Complexオブジェクト”を演算する／演算子で実行される処理を示す図である。
【図６９】“Vectorオブジェクト＋Vectorオブジェクト”を演算する＋演算子で実行される処理を示す図である。
【図７０】“Vectorオブジェクト−Vectorオブジェクト”を演算する−演算子で実行される処理を示す図である。
【図７１】Vectorクラスの，＋単項演算子で実行される処理を示す図である。
【図７２】Vectorクラスの，−単項演算子で実行される処理を示す図である。
【図７３】VectorクラスのメソッドTransで実行される処理を示す図である。
【図７４】VectorクラスのメソッドNormL2で実行される処理を示す図である。
【図７５】２つのVectorオブジェクトを引数とするフレンド関数Dotで実行される処理を示す図である。
【図７６】Vectorクラスの，Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図７７】Vectorクラスの，Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図７８】Vectorクラスの，Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図７９】Vectorクラスの，Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図８０】Vectorクラスの，Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。
【図８１】Vectorクラスの，引数なしのメソッドevaluateで実行される処理を示す図である。
【符号の説明】
【０２８１】
１０１  ＣＰＵ
１０２  ＲＡＭ
１０３  ＲＯＭ
１０４  キーボード
１０５  ディスプレイ
１０６  ＨＤＤ
１０７  通信Ｉ／Ｆ
１０８  バス
【図１】
2007328692.tif 000003
【図２】
2007328692.tif 000004
【図３】
2007328692.tif 000005
【図４】
2007328692.tif 000006
【図５】
2007328692.tif 000007
【図６】
2007328692.tif 000008
【図７】
2007328692.tif 000009
【図８】
2007328692.tif 000010
【図９】
2007328692.tif 000011
【図１０】
2007328692.tif 000012
【図１１】
2007328692.tif 000013
【図１２】
2007328692.tif 000014
【図１３】
2007328692.tif 000015
【図１４】
2007328692.tif 000016
【図１５】
2007328692.tif 000017
【図１６】
2007328692.tif 000018
【図１７】
2007328692.tif 000019
【図１８】
2007328692.tif 000020
【図１９】
2007328692.tif 000021
【図２０】
2007328692.tif 000022
【図２１】
2007328692.tif 000023
【図２２】
2007328692.tif 000024
【図２３】
2007328692.tif 000025
【図２４】
2007328692.tif 000026
【図２５】
2007328692.tif 000027
【図２６】
2007328692.tif 000028
【図２７】
2007328692.tif 000029
【図２８】
2007328692.tif 000030
【図２９】
2007328692.tif 000031
【図３０】
2007328692.tif 000032
【図３１】
2007328692.tif 000033
【図３２】
2007328692.tif 000034
【図３３】
2007328692.tif 000035
【図３４】
2007328692.tif 000036
【図３５】
2007328692.tif 000037
【図３６】
2007328692.tif 000038
【図３７】
2007328692.tif 000039
【図３８】
2007328692.tif 000040
【図３９】
2007328692.tif 000041
【図４０】
2007328692.tif 000042
【図４１】
2007328692.tif 000043
【図４２】
2007328692.tif 000044
【図４３】
2007328692.tif 000045
【図４４】
2007328692.tif 000046
【図４５】
2007328692.tif 000047
【図４６】
2007328692.tif 000048
【図４７】
2007328692.tif 000049
【図４８】
2007328692.tif 000050
【図４９】
2007328692.tif 000051
【図５０】
2007328692.tif 000052
【図５１】
2007328692.tif 000053
【図５２】
2007328692.tif 000054
【図５３】
2007328692.tif 000055
【図５４】
2007328692.tif 000056
【図５５】
2007328692.tif 000057
【図５６】
2007328692.tif 000058
【図５７】
2007328692.tif 000059
【図５８】
2007328692.tif 000060
【図５９】
2007328692.tif 000061
【図６０】
2007328692.tif 000062
【図６１】
2007328692.tif 000063
【図６２】
2007328692.tif 000064
【図６３】
2007328692.tif 000065
【図６４】
2007328692.tif 000066
【図６５】
2007328692.tif 000067
【図６６】
2007328692.tif 000068
【図６７】
2007328692.tif 000069
【図６８】
2007328692.tif 000070
【図６９】
2007328692.tif 000071
【図７０】
2007328692.tif 000072
【図７１】
2007328692.tif 000073
【図７２】
2007328692.tif 000074
【図７３】
2007328692.tif 000075
【図７４】
2007328692.tif 000076
【図７５】
2007328692.tif 000077
【図７６】
2007328692.tif 000078
【図７７】
2007328692.tif 000079
【図７８】
2007328692.tif 000080
【図７９】
2007328692.tif 000081
【図８０】
2007328692.tif 000082
【図８１】
2007328692.tif 000083