פרויקט תוכנה, שאלות ותשובות!


פרויקט תוכנה, שאלות ותשובות!מיכאל(פרוייקט תוכנה) 19.07.2006 14:32
היי חברים !
כאן תוכלו לשאול שאלות ולקבל תשובות בכל מה שקשור בפרויקט.
אל תתביישו לשאול, כל שאלה היא לגיטימית וכל שאלה תיענה בהקדם.
שאלה בקשר לפרוייקטtomash(פרוייקט תוכנה) 19.07.2006 16:53
יש לי שאלה על הפרוייקט, על הפונק' COMPRESS.
מתוך מה שהבנתי, משנים את הערכים של הקודקודים, אבל מספר הקודקודים הכללי נשאר אותו דבר, זה נכון?דבר שני, מישהו יוכל להסביר לי איך צריך (אם בכלל) לשנות את הפאות? הם לא כתבו כלום על לשנות את הפאות לא במצגת ולא בPDF, ואם צריך להשאיר אותם אותו דבר איך צריך לעשות אנלוגיה בין הקודקודים הישנים לחדשים?
תקועים בשלב ה- decomposition - הלפ אס, פז'לוסטהDrgnsMstr(פרוייקט תוכנה) 19.07.2006 20:25
היי אנשים,

אני וידידי יוני בלוך הזמר המפורסם בתבל יושבים על הפרוייקט כצמד ניגרוס ואנחנו תקועים בקטע ממש מטריד - אין לנו מושג איך עושים את ה- decomposition
בלוך העלה השערה מעניינת שחשבנו ללכת עליה אבל רק רצינו לוודא קודם, לפי בלוך, זה ככה:
1. מגרילים k וקטורים
2. מכפילים כל וקטור ב-A
3. עושים על הוקטורים גרהם שמידט עם נירמוליזציה
4. לכל וקטור, אם הנורמה שלו פחות שלו כפול A או משהו כזה קטנה מאפסילון, הוא סבבה, אחרת שוב מכפילים אותו ב- A ואז חוזרים לשלב 3.

לפי דעתי יוני בלוך טועה בכלל והדרך לעשות את זה היא לעשות Power Method, לקחת את הוקטור הזה וכל פעם לעבוד עם וקטור אחד ועם בסיס אורטוגונלי שמבוסס על שאר הוקטורים העצמיים שמצאנו - ז"א לא עובדים עם k וקטורים במכה אלא על וקטור אחד כל פעם כששאר הוקטורים "קבועים"

טוב אנחנו דפוקים אנחנו מודעים לכך ואנחנו מתחננים לעזרתם אוווו סטודנטים נעלים שכמותכם.

חוצמזה, פז מוסר שהוא משתוקק לפין

- בנחמין רוחס
פז, רוצה בננה?Melnorme(פרוייקט תוכנה) 19.07.2006 21:37
מר בלוך צודק. רק מה, אל תפסיקו להכפיל את המטריצה בווקטור אחרי שהע"ע שלו כבר הגיע לדיוק מספיק - להמשיך להכפיל את כולם עד הסוף, עד שכל הע"ע התגלו.
שאלה בקשר לpower method.גיל(פרוייקט תוכנה) 22.07.2006 15:49
בfaq באתר כתוב שצריך לנרמל את\normalsize A^m*x בכל איטרציה (אחרי שבודקים התכנסות). עד כמה שאני זוכר, לנרמל וקטור V אומר לחלק את כל הקורדינאטות שלו (כל ה \normalsize V_{i}) בנורמה של V. אני זוכר נכון? באיזו נורמה צריך להשתמש? תודה מראש.

הנירמולמיכאל(פרוייקט תוכנה) 22.07.2006 15:54
הכוונה בנירמול היא לעשות גרם-שמידט
אחרי כל איטרציה של הכפלה אתה צריך לעשות גרם-שמידט.
גרם שמידט?גיל(פרוייקט תוכנה) 22.07.2006 16:02
על איזו קבוצת וקטורים אני צריך לעשות גרם-שמידט? מה אני בדיוק אמור לעשות? אני שונא power-method!!!
תשובהיוסי(פרוייקט תוכנה) 22.07.2006 16:13
אתה מנרמל וקטור על ידי חלוקת רכיביו בנורמה 2 של הוקטור
אחרי שנירמלת אותו אתה יכול להשתמש בו בגרהם שמידט של הוקטורים הבאים בלי לחלק בנורמה, כי היא כבר 1.
טוב, אני יוצא קצת קשה הבנה כאן...גיל(פרוייקט תוכנה) 22.07.2006 17:25
בפונ' dominant_eig עצמה, אני צריך לנרמל את A^m*x בסוף של כל איטרציה על ידי חלוקת הרכיבים שלו בנורמה 2 שלו. מה שאמרת לגבי הגרהם-שמידט מתייחס לפונקציות שקשורות ל matrix_decomp וcompress (שעליהן עוד לא התחלתי לעבוד), נכון? בפונ' dominant_eig אני לא צריך לדחוף גרהם-שמידט? תודה.
לא חשוב, הסתדרתי.גיל(פרוייקט תוכנה) 22.07.2006 17:39
בעיות עם הpower method.גיל(פרוייקט תוכנה) 22.07.2006 19:01
אני לא בטוח שהבנתי עד הסוף מה בדיוק צריך לעשות ב dominant_eig. הנה חלק מהקוד שכתבתי ל dominant_eig:

void dominant_eig(sparse_matrix_arr* matrix, float precision, float* eig_vec, float *eig_val,int nnz)
{
elem *X; //a random vector that is used in the power method
elem *Y; //a random vector that is used in the power method
elem temp_eig_val; //will save the current evaluation of the eigen value
int i;
int N=matrix->n; //the matrix size;
int m=0;
elem eig_num; //temp_eig_val = A(A^m*X)*Y / (A^m*X)*Y; eig_num
elem eig_denom; //and eig_denom are the upper and the bottom
//parts of the fraction corresponding (num=upper,denom=bottom
elem *temp_vec_1;
elem *temp_vec_2;
elem dif; // dif= || A(A^m*X)-lambda1*(A^m*X)||



X=(elem *)calloc(N,sizeof(elem),');
for (i=0;i {
X[i]=(rand() % 10,');
}




for (m=1;m>0;m++)
{

/*
Y=A^m*X
lambda1= A(A^m*X)Y / (A^m*X)Y //eig_val
V1=A^m*X //eig_vec

or in other words:
lambda1=(AY)*Y / Y*Y
V1=Y

condition:

|| A(A^m*X)-lambda1*(A^m*X)|| <=epsilon
or in other words:

||A*Y - lamba1*Y||<=epsilon



we need to compute: A*X, A^2*X, A^3*X,... and we compute it as A*X,
A(A*X), A(A(A*X)),...

*/


Y=mat_vector_mult(matrix,Y,'); //Y=A*Y = A(A(A(A...(A*X))))...) = A^m*X
temp_vec_1=mat_vector_mult(matrix,Y,'); //temp_vec1=AY = A^(m+1) * X
eig_num=vec_mult_vec(temp_vec_1,Y,N,'); //eig_num=(AY)*Y
eig_denom=vec_mult_vec(Y,Y,N,'); //eig_denom=Y*Y
temp_eig_val = eig_num / eig_denom;

//temp_vec_2=lambda1*Y
for (i=0; i {
temp_vec_2[i]=temp_eig_val*Y[i];
}
dif=dif_precision(temp_vec_1,temp_vec_2,N,'); // dif=||A*Y - lamba1*Y||

if (dif <= precision)
{
for (i=0;i {
eig_vec[i]=Y[i];
}
*eig_val=temp_eig_val;


free(temp_vec_1,');
free(temp_vec_2,');
free(X,');
free(Y,');
return;
}

normalize_vec(Y,N,');
}
}

בקוד רק חסר את המקרה שm=0.

חוץ מבאגים קטנים, הקוד נכון? יש טעויות קריטיות של הבנה של השיטה? אני פשוט תקוע עם באגים ואני לא בטוח שמה שעשיתי זה בכלל מה שצריך. אם משהו לא ברור בקוד שלי, אין לי בעיה להסביר.
תודה מראש.
נראה בסדר..יוסי(פרוייקט תוכנה) 23.07.2006 22:07
באופן עקרוני זה נראה בסדר, אני ממליץ לך לוודא את הנכונות של הפעולות המתמטיות, כלומר שאתה באמת מכפיל מה שצריך. תרשום את זה על דף או משהו כזה. אני ממליץ לך גם להשתמש בכמה שפחות משתנים ולתת להם מות משמעותיים.
בהצלחה!
האם קיימות מטריצות שהpower method לא מתכנס עבורן?גיל(פרוייקט תוכנה) 29.07.2006 23:44
הפונ' שכתבתי (dominant_eig) מתכנסת רוב הפעמים, אבל יש מטריצות שעבורן היא לא מתכנסת. הקטע המוזר הוא שבדקתי עבור כמה מטריצות כאלו בקוד של חבר שלי וגם אצלו הן לא מתכנסות. אז המטריצות דפוקות או שאני דפוק? הנה המטריצות:
0 0 1
0 0 1
1 1 0

N=3, nnz=4;
A->values[0]=1;
A->values[1]=1;
A->values[2]=1;
A->values[3]=1;

A->rowind[0]=2;
A->rowind[1]=2;
A->rowind[2]=0;
A->rowind[3]=1;

A->colptr[0]=0;
A->colptr[1]=1;
A->colptr[2]=2;
A->colptr[3]=4;






0 1 0
1 0 1
0 1 0

N=3,nnz=4;
A->values[0]=1;
A->values[1]=1;
A->values[2]=1;
A->values[3]=1;

A->rowind[0]=1;
A->rowind[1]=0;
A->rowind[2]=2;
A->rowind[3]=1;

A->colptr[0]=0;
A->colptr[1]=1;
A->colptr[2]=3;
A->colptr[3]=4;




0 1 1
1 0 0
1 0 0

N=3,nnz=4;
A->values[0]=1;
A->values[1]=1;
A->values[2]=1;
A->values[3]=1;

A->rowind[0]=1;
A->rowind[1]=2;
A->rowind[2]=0;
A->rowind[3]=0;

A->colptr[0]=0;
A->colptr[1]=2;
A->colptr[2]=3;
A->colptr[3]=4;



מישהו נתקל בבעיות כאלו? אתם יכולים בבקשה לבדוק את המקרים האלו בפונ' שלכם? כי אני די בטוח שהקוד שלי (והקוד של חבר שלי) בסדר ואני כבר משתגע מזה. תודה מראש.
הכוונה היא שהפונ' לא מתכנסת באופן מדוייקגיל(פרוייקט תוכנה) 30.07.2006 17:10
גם אחרי שאני מגריל וקטור התחלתי חדש.

כל ההודעות בערוץ