행렬곱을 구하는것입니다....
주석좀 부탁드립니다.
void mmilt(term a[], termb[], term d[])
/*두 희소행렬을 곱한다. */
{
int i, j, column, totalb = b[0].value, totald = 0 ;
int rows_a = a[0].row, cols_a = a[0].col ;
totala = a[0].value ; int cols_b = b[0].col ;
int row_begin = 1, row = a[1].row, sum = 0 ;
int new_b[MAX_TERMS][3] ;
if(cols_a != b[0].row {
fprintf(stderr, "Incompatible matrices\n");
exit(1) ;
}
fast_transpose(b, new_b) ;
/*경계조건 설정*/
a[totala + 1].row = rows_a ;
new_b[totalb + 1].row = cols_b ;
new_b[totalb + 1].col = 0 ;
for (i=1 ; i <= totala; ) {
column = new_b[1].row ;
for (j =1 ; j <= totalb + 1 ; ) {
/* a의 행과 b의 열을 곱한다. */
if(a[i].row != row) {
storesum (d, &totald, row, column, &sum);
i = row_begin ;
for ( ; new_b[j].row == column; j++ )
;
column = new_b[j].row ;
}
else if(new_b[j].row != column) {
storesum(d, &totald, row, column, &sum);
i = row_begin ;
column = new_b[j].row ;
}
else swich (COMPARE(a[i].col, new_b[j].col)) {
case -1 ; /*a의 다음 항으로 이동 */
++i ; break++ ;
case 0 ; /*항을 더하고, a와 b를 다음 항으로 이동 */
sum += (a[i++].value*new_b[j++].value) ; ;
break;
case 1 ;/*b항을 다음항으로 이동 */
j++ ;
}
} /*for j<=totalb+1 문의 끝 */
for ( ; a[i].row==row ; i++)
;
row_begin = i ; row = a[i].row ;
} /* tatala문의 끝 */
d[0].row = rows_a ;
d[0].col = cols_b ; d[0].value = totald;
}
여기서 fast_transpoe 함수는 전치행렬을 만드는 것이구요,
stroresum함수는 행, 열 위치와 함께 행렬 d의 *totald+1 원소로 저장하는 함수입니다.
저의 무지를 채워주시기 바랍니다. (--)(__)
|