توضیح در مورد ضرب ماتریس اسپارس

shahinshyd

Member
با سلام
سر کلاس استاد یه سورس ماتریس اسپاریس نوشت که من هیچی نفهمیدم
اگه از اساتید کسی سورس++c ضرب ماتریس اپارس رو داره با یه توضیح بذاره
باتشکر
 

seyed pouria

New Member
سلام دوست عزیز
در ماتریس های اسپارس همانطور که می دانید تعداد خانه های صفر ( یک مدل ) زیاد است پس صرفه به استفاده از روش معمولی نیست .
حتما با روش ذخیره سازی این نوع ماتریس ها آشنا هستید .
باید در هر مرحله عنصر k ام سطر i ام از ماتریس اول را در عنصر k ام از ستون j ام از ماتریس دوم را در هم ضرب کرد و حاصل را به عنوان عنصر در مکان i , j از ماتریس سوم قرار داد .
نکته مهم این است که حاصل ضرب دو ماتریس اسپارس حتما یک ماتریس اسپارس نخواهد بود .
عمل بالا را می توان با سه حلقه for تو در تو پیاده سازی کرد و برای جستجو هم از جستجوی خطی ساده استفاده کرد .
برای اطلاعات بیشتر : کتاب ساختمان داده ها در ++ C مهندس جعفر نژاد قمی

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int **arr,**bb,*t,*p;
int main()
{ clrscr();
int i,j,x,y,a=2,b=1,z=0,u=3;
cout<<"enter x:";
cin>>x;
cout<<"enter y:";
cin>>y;
p=(int *)malloc(sizeof(int)* x);
for(i=1;i<=x;i++)
arr=(int *)malloc(y * sizeof(int));
for(i=1;i<=x;i++)
for(j=1;j<=y;j++)
{
cout<<"enter arr["<<i<<"]["<<j<<"]=";
cin>>arr[j];
}
for(i=1;i<=x;i++)
for(j=1;j<=y;j++)
if(arr[j]!=0 )z++;
t=(int *)malloc(u * sizeof(int));
for(i=1;i<x;i++)
bb=(int *) malloc(z * sizeof(int));

bb[1][1]=x;
bb[1][2]=y;
bb[1][3]=z;
for(i=1;i<=x;i++)
for(j=1;j<=y;j++)
if(arr[j]!=0)
{
bb[a]=i;
b++;
bb[a]=j;
b++;
bb[a]=arr[j];
b=1;
a++;
}
for(i=1;i<=(z+1);i++)
for(j=1;j<=3;j++)
{
cout<<bb[j];
if (j==3)
cout<<endl;
}
getch();
return 0;
}
 

shahinshyd

Member
باسلام
دوست من مثل اینکه من سوال خودمو درست نگفتم من میخواستم که این برنامه دوتا ماتریس اپارس گرفته و در هم ضرب کنه لطفا راهنمایی کنید
 

hoceyn

Active Member
کدی که پیچیدگیش O(colum*element) هست رو حتی کتاب هوریتز نیاورده . اما اصولش اینطوره که ما از دوتا ماتریس استفاده می کنیم که این وژگی هارو داره:
1.تعداد درایه هاش به تعداد درایه های غیر صفر ماتریس اولیه است.
2.هر درایه 3 عضو داره: طول ، عرض و مقدار
(row , column,data)

حالا به جای اینکه دو آرایه رو با پیچیدگی n^3 در هم ضرب کنیم این کارو با یه الگوریتم که بالا هست انجام میدیم. البته این الگوریتم اصلا کارا نیست و یه الگوریتم دیگه هست که به علت پیچیدگی تو هیچ کتابی نگفتنش (!!!) و پیچیدگیه
)O(column * element
داره
 

جدیدترین ارسال ها

بالا