2005년 12월 7일 수요일

행렬(Matrix) 곱셈하기

. Maple 9
Help -> Contents -> Mathematics -> Linear Algebra
-> LinearAlgebra Package -> Standart
-> MatrixMatrixMultiply
(Search에서는 matrix라고 입력한다. 하지만 검색엔진이 별로라서
원하는 것을 쉽게 찾기는 어렵다.)
Maple은 매우 느리므로 아래 내용을 한 줄씩 입력한다.
---
with(LinearAlgebra):
A:=Matrix([[1,2],[1,2]]);
MatrixMatrixMultiply(A, A);

P1:=Matrix([[0.7, 0.3, 0], [0.1, 0.25, 0.65], [0.1, 0.25, 0.65]]);
P2:=MatrixMatrixMultiply(P1, P1);
P4:=MatrixMatrixMultiply(P2, P2);
P8:=MatrixMatrixMultiply(P4, P4);
P16:=MatrixMatrixMultiply(P8, P8);
P32:=MatrixMatrixMultiply(P16, P16);
---
새로운 package사용시 ;이 아닌 :를 입력하는 점도 특이하다.
에러 체크도 잘 안되니 주의 할 것
Matrix([[0.7, 0.3, 0], [0.1, 0.25, 0.65], [0.1, 0.25, 0.65]])

[[0.7, 0.3, 0], [0.1, 0.25, 0.65], [0.1, 0.25, 0.65]]

모두 변수에 잘 들어가지만
위의 것은 matrix이고 아래 것은 array인 것 같다.
따라서 아래 것은 matrix 연산이 안된다.

. Excel
SUMPRODUCT()는 행array x 행array or 열array x 열array만 지원한다.
따라서 MMULT()라는 함수를 쓰면 된다.
행array x 열array를 지원한다.

. GSL(GNU scientific Library)를 이용한다.
http://www.gnu.org/software/gsl/

기본 matrix 연산에는 element 곱셈만 있고 matrix 곱셈은 BLAS를 쓴다.
예)
#include <stdio.h>
#include <gsl/gsl_blas.h>

int _tmain(int argc, _TCHAR* argv[])
{
double a[] = { 0.11, 0.12, 0.13,
0.21, 0.22, 0.23 };

double b[] = { 1011, 1012,
1021, 1022,
1031, 1032 };

double c[] = { 0.00, 0.00,
0.00, 0.00 };

gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);

/* Compute C = A B */

gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
1.0, &A.matrix, &B.matrix,
0.0, &C.matrix);

printf ("[ %g, %g\n", c[0], c[1]);
printf (" %g, %g ]\n", c[2], c[3]);

return 0;
}
http://www.gnu.org/software/gsl/manual/gsl-ref_12.html#SEC215
http://www.gnu.org/software/gsl/manual/gsl-ref_8.html#SEC173

. Visual Studio .NET에서 GDI+에 Matrix라는 class가 있고 3x3 matrix 연산이 있다.

댓글 없음:

댓글 쓰기