関数multiply_matrix3_mdm マニュアル

(The documentation of function multiply_matrix3_mdm)

Last Update: 2021/12/6


◆機能・用途(Purpose)

3つの行列の積を計算する。 1つ目と3つ目がstruct matrix型、2つ目がstruct diagonal_matrix型の場合用で、 関数名の「mdm」は matrix × diagonal matrix × matrix という意味である。
Calculate the product of three matrices. This function assumes that the first and third matrices are represented by struct matrix type, and the second one is represented by struct diagonal_matrix type. The function name “mdm” means matrix × diagonal matrix × matrix.


◆形式(Format)

#define MULTIPLY_MATRIX_VERBOSE 0 //→進行状況を表示したくない場合 (To suppress displaying the progress)
#include <matrix/operation.h>
inline struct matrix multiply_matrix3_mdm
(const struct matrix A,const struct diagonal_matrix Lambda,
 const struct matrix C)


◆引数(Arguments)

A 積の計算に用いる1つ目の行列\(\myvector{A}\)。
The first matrix \(\myvector{A}\) used in the calculation of the product.
L 積の計算に用いる2つ目の行列(対角行列)\(\myvector{\Lambda}\)。 行数は\(\myvector{A}\)の列数と等しくなければならない。
The second matrix \(\myvector{\Lambda}\) (a diagonal matrix) used in the calculation of the product. The number of rows of \(\myvector{\Lambda}\) must be equal to the number of columns of \(\myvector{A}\).
C 積の計算に用いる3つ目の行列\(\myvector{C}\)。 行数は\(\myvector{\Lambda}\)の列数と等しくなければならない。
The third matrix \(\myvector{C}\) used in the calculation of the product. The number of rows of \(\myvector{C}\) must be equal to the number of columns of \(\myvector{\Lambda}\).


◆戻り値(Return value)

行列\(\myvector{A}\myvector{\Lambda}\myvector{C}\)を表す構造体。 戻り値のメンバの値は以下のようになる。
A structure which represents a matrix \(\myvector{A}\myvector{\Lambda}\myvector{C}\). The values of members of the return value are as follows.

戻り値のメンバ
Member of the return value

Value
rowmax A.rowmax
columnmax C.columnmax
各\(i\), \(j\)に対するmain[i][j]
main[i][j] for each \(i\) and \(j\)
行列\(\myvector{A}\myvector{\Lambda}\myvector{C}\) の\((i,j)\)成分。
The \((i,j)\) component of matrix \(\myvector{A}\myvector{\Lambda}\myvector{C}\).
allocated ’y’


◆使用例(Example)

struct matrix A,C;
struct diagonal_matrix Lambda;
struct matrix D=multiply_matrix3_mdm(A,Lambda,C);


◆補足(Additional notes)

行列の積の計算は時間がかかるのでデフォルトで進行状況を表示する仕様にしている。 進行状況を表示したくない場合はプログラムの冒頭に 「#define MULTIPLY_MATRIX_VERBOSE 0」と書く。
Since it takes time to compute the product of matrices, its progress is displayed by default. To suppress displaying the progress, write “#define MULTIPLY_MATRIX_VERBOSE 0” at the top of the program.


◆計算方法(Computation method)

関数matrix_times_diagonal_matrixまたはdiagonal_matrix_times_matrixと multiply_matrix (いずれもmatrix/operation.h)を呼び出すことにより、 \((\myvector{A}\myvector{\Lambda})\myvector{C}\) または \(\myvector{A}(\myvector{\Lambda}\myvector{C})\) のうち計算回数が少ない方の計算を行う。
Function matrix_times_diagonal_matrix or diagonal_matrix_times_matrix is called, followed by function multiply_matrix (all in matrix/operation.h), to calculate \((\myvector{A}\myvector{\Lambda})\myvector{C}\) or \(\myvector{A}(\myvector{\Lambda}\myvector{C})\) depending on the number of calculations.

行列\(\myvector{A}\)のサイズを\(N_1\times N_2\)、 \(\myvector{\Lambda}\)のサイズを\(N_2\times N_3\)、 \(\myvector{C}\)のサイズを\(N_3\times N_4\)とする。 行列と対角行列の積の計算にはあまり時間がかからないので無視することにし、 非対角行列同士の積の計算のみでカウントすると \((\myvector{A}\myvector{\Lambda})\myvector{C}\) の計算では\(N_1 N_3 N_4\)回、 \(\myvector{A}(\myvector{\Lambda}\myvector{C})\) の計算では\(N_1 N_2 N_4\)回の計算が必要になる。 したがって \(N_3 \leq N_2\)のときは \((\myvector{A}\myvector{\Lambda})\myvector{C}\)を計算し、 \(N_3 > N_2\)のときは \(\myvector{A}(\myvector{\Lambda}\myvector{C})\)を計算する。
Let the sizes of matrices \(\myvector{A}\), \(\myvector{\Lambda}\), and \(\myvector{C}\) be \(N_1\times N_2\), \(N_2\times N_3\), and \(N_3\times N_4\), respectively. Then the numbers of calculations needed, ignoring the calculation of a product of matrix and diagonal matrix and counting only the product of non-diagonal matrices, are \(N_1 N_2 N_4\) for a calculation of \((\myvector{A}\myvector{\Lambda})\myvector{C}\), and \(N_1 N_2 N_4\) for a calculation of \(\myvector{A}(\myvector{\Lambda}\myvector{C})\). Therefore the function chooses \((\myvector{A}\myvector{\Lambda})\myvector{C}\) in case of \(N_3 \leq N_2\), and \(\myvector{A}(\myvector{\Lambda}\myvector{C})\) otherwise.