PDA

View Full Version : ضرب ماتریس ها



Hello,World!!
یک شنبه 02 آبان 1389, 19:50 عصر
سلام به همه دوستان
من یه برنامه واسه ضرب دو ماتریس نوشتم. به نظر درسته ولی اجرا نمی شه و segmentation fault می ده . ممنون می شم راهنمایی کنید


# include <stdio.h>

void mul ( int ** , int ** , int);
int main()
{
int ** mat1 ;//,mat2 ;
int ** mat2;
int n ,i ,j;
system ( "clear");
printf ( "please Enter the matrix size :\n note : matrix is n*n\n" );
scanf ( "%d" , &n );
mat1 = (int **) malloc (sizeof(int) * n);
for ( i = 0 ; i < n ;i++ )
mat1[i] = ( int * ) malloc ( sizeof (int) * n);
mat2 = (int **) malloc (sizeof(int) * n);
for ( i = 0 ; i < n ;i++ )
mat2[i] = ( int * ) malloc ( sizeof (int) * n);
printf( " Enter first matrix elemens:\n");
for ( i=0 ; i<n ; i++ )
for ( j = 0; j<n ;j++)
scanf ( "%d" , &mat1[i][j]);
printf( " Enter second matrix elemens:\n");
for ( i=0 ; i<n ; i++ )
for ( j = 0; j<n ;j++)
scanf ( "%d" , &mat2[i][j]);
mul ( mat1 , mat2 , n );
for ( i=0 ; i<n ; i++)
free ( mat1[i]);
free ( mat1 );
for ( i=0 ; i<n ; i++)
free ( mat2[i]);
free ( mat2);


return 0;
}
void mul ( int ** mat1 , int ** mat2 , int n ){

int i , j,k ;
int ** mat3;
mat3 = (int **) malloc ( sizeof ( int) * n );
for ( i = 0 ; i < n; i++ )
mat3[i] = ( int * ) malloc ( sizeof ( int ) * n) ;
for ( i = 0 ; i< n; i++ )
for ( j = 0 ; j < n ; j++ )
mat3 [i][j] = 0;
for ( k=0 ; k < n ; k++ )
mat3[i][j] = mat3[i][j] + mat1[i][k] * mat2[k][j];
printf ( "\n The multiply of matrixes is:\n");
for ( i = 0 ; i<n ; i++) {
for ( j=0 ; j<n ; j++)
printf ("%d ",mat3[i][j]);
printf( "\n");
}
for ( i=0 ; i<n ; i++)
free( mat3[i]);
free ( mat3);
}

sh4mid
دوشنبه 03 آبان 1389, 10:50 صبح
سلام
مشکل تو تعریف تابع ضربت هست

for ( i = 0 ; i< n; i++ )
for ( j = 0 ; j < n ; j++ )
{
mat3 [i][j] = 0;
for ( k=0 ; k < n ; k++ )
mat3[i][j] = mat3[i][j] + mat1[i][k] * mat2[k][j];
}
همین دو تا آکولاد کوجولو :لبخند:
حالا چرا؟
یک نگاه به کدت قبل از اضافه کردن آکولاد بنداز


for ( i = 0 ; i< n; i++ )
for ( j = 0 ; j < n ; j++ )
mat3 [i][j] = 0;
for ( k=0 ; k < n ; k++ )
mat3[i][j] = mat3[i][j] + mat1[i][k] * mat2[k][j];

مشکل این کد اینه که دوتا حلقه for اولی فقط روی
mat3 [i][j] = 0; اعمال میشه و وقتی از این دو تا حلقه میاد بیرون میرود سراغ حلقه for آخر ،
وقتی هم که به اونجا میرسه مقادیر iوj برابرند با n ، و در نتیجه عبارتی مثل
mat3 [i][j] همون
mat3 [n][n]
هست که به ناکجا آباد اشاره می کنه(یادت هست که آرایه تو C از 0 شروع میشه یعنی آخرین خونه ماتریس ها همون
mat[n-1][n-1] هست)

هم دانشگاهی
دوشنبه 03 آبان 1389, 11:37 صبح
من هم در تکمیل صحبت sh4mid باید عرض کنم که اگر کتابخانه stdlib.h را هم اضافه کنید بد نیست!

Hello,World!!
دوشنبه 03 آبان 1389, 14:10 عصر
ممنون از دوستان مشکل همون آکولاد ها بود و درست شد. اما در مورد تخصیص حافظه برای آرایه دو بعدی همین جور باید حافظه تخصیص بدید و اینطور که شما نوشتید کاملا اشتباهه.