מטריצות ב-C++

hellooo

New member
מטריצות ב-C++

איך אני מעבירה מטריצה 4X4 בפונקציה ב- C++??? איך ההגדרה נראית, הקריאה וההצהרה? ואם אני רוצה להעביר אותה By referance זה משתנה? ז"א במקום שהיא תחזיר ערך אני רוצה לשלוח לה 2 מטריצות שתכניס לשניה בתוך הפונקציה את הערכים. אבל שזו אכן תהיה אותו מטריצה ולא העתק שלה.. תודה..
 

זהיר

New member
תלוי מה את רוצה/צריכה לעשות איתה

ואם זה תרגיל בצפר תגידי מה למדתם שאפשר יהיה להתייחס. ןבכלל - למה דווקא 4X4 ?
 

hellooo

New member
טוב..

4X4 סתם צינתי לדוגמא.. אפשר להתיחס להכל, זה לא תרגיל בצפר.. אני צריכה למשל לשלוח 3 מטריצות שהפו' תעשה כפל של 2 המטריצות ותכניס את התוצאה במטריצה השלישית.. ניסתי כל מיני אפשרויות ועל הכל קבלתי ERROR..
 
פאאק התפוז לא נותן לי לשלוח קבצים

#include<stdio.h> #include<stdlib.h> #include<conio.h> void cefel(int a[5][5]); void fullmatrix(); void show(int a[5][5]); void aftershow(int c[5][5]); void main() { fullmatrix(); } void aftershow(int c[5][5]) { int k,j; system("cls"); puts("ARRY B"); for(j=0;j<5;j++) { for(k=0;k<5;k++) { printf("[%d]",c[j][k]); } puts(""); } } void show(int a[5][5]) { int k,j; puts("ARRY A"); for(j=0;j<5;j++) { for(k=0;k<5;k++) { printf("[ %d ]",a[j][k]); } puts(""); } } void fullmatrix() { int a[5][5]={0},d=1,j,k; for(j=0;j<5;j++) { for(k=0;k<5;k++) { a[j][k]=d; d++; } } show(a); getch(); cefel(a); } void cefel(int a[5][5]) { int c[5][5]={0}; int i,j,k,sum=0; for(i=0;i<5;i++) { for(j=0;j<5;j++) { for(k=0;k<5;k++) { sum+=a[k]*a[k]; } c[j]=sum; } } aftershow(c); }
 

hellooo

New member
השליחה בצורה הזו משום מה..

כן עבדה למרות שזה C.. אבל שוב אני לא צריכה את הפו'!!! רק איך לשלוח ודוקא By Referance.. עד כמה שאני זוכרת צריך להוסיף & כדי לשלוח By Referance אבל זה מחזיר לי ERROR אני כנראה לא שמה את זה נכון או משהו כה..
 

hellooo

New member
תודה..

קודם כל לא הייתי צריכה את הפו' רק את הקטע של השליחה של המטריצות. אבל תודה בכל אופן, מקווה שהיה לך מוכן ולא ישבת עכשיו לכתוב את זה במיוחד.. דבר שני איך אני שולחת By Referance?? כי אם אני שולחת כמו כאן אז זה בעצם מעתיק לי את המטריצות, לא? ואם אני רוצה לשלוח מטריצה שלתוכה אני אכניס תוצאות בתוך הפו' זה לא יעבוד..
 

hellooo

New member
כן..

אבל זה לא עקרוני.. רק שאלתי איך לשלוח, להגדיר ולהצהיר..
 

אלדד28

New member
יש הרבה דרכים

את יכולה באמת להשתמש ב-[matrix[4][4 - זה לא יעתיק לך אותה ולא ישלח אותה by reference, זה מעביר רק את המצביע לתחילת המטריצה. אל תדאגי בקשר לביצועים. ו... את יכולה לעשות את זה בצורה יותר מתוחכמת - השאלה היא אם את צריכה את זה. את יכולה להגדיר מחלקה, נקרא לה CMatrix, ובתוכה להחזיק את המטריצה. רמת המחלקה יכולה לנוע בין סתם מבנה שמחזיק מטריצה 4x4 כמו -
class CMatrix { public: int matrix[4][4]; } ... void f(CMatrix &mat) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { cout << i << " " << j << " " << mat.matrix[j] << endl; } } }

ועד למחלקה מתוחכמת עם העמסת האופרטור [] ושאר האופרטורים, שמתבססת על template לטיפוס הבסיסי שלה (שלא יהיה חייב להיות int). BOTTOM LINE - את צריכה להחליט מה בדיוק את רוצה. לצורך השאלה שלך את יכולה אפילו להגיע לרמה של -
mat3 = mat1 * mat2; // Not very efficient mat3 = mat1; // A bit more efficient... mat3 *= mat2;​
זהו!
 

hellooo

New member
תודה.. אני אסתפק בפחות..

מתוחכם.. לא כל כך מעניין פה הקוד העניין הוא התוצאה.. תודה..
 

voguemaster

New member
עאלק a bit!!!!

זה חוסך 2 קריאות ctor וקריאה שלמה של dtor, אם זכרוני אינו מטעני
זה ממש לא a bit more efficient, זה הרבה יותר יעיל!
 

אלדד28

New member
לא בדיוק. הדבר העיקרי שזה חוסך

הוא החזרה by value של ה-class באופרטור +.
 

voguemaster

New member
זה לא נכון אחשלו

אם אתה מחזיר אובייקט חדש ע"י return ואין לך אפשרות לבצע את החישוב של הכפלת המטריצות בשורה אחת (תקן אותי אם אני טועה אבל אין אפשרות כזו) אז תיאלץ ליצור אובייקט זמני שאותו אתה מחזיר by value. האובייקט הלוקלי הזמני הזה נבנה ומושמד, אין מה לעשות. הנה דוגמא למה שאתה מדבר עליו:
Rational Rational::eek:perator*( Rational &lhs, Rational &rhs) { return Rational( lhs.a * rhs.a, lhs.b * rhs.b); }​
כאשר המספר מאוחסן בצורה a/b. במקרה כזה אתה צודק לחלוטין, יש פה רק העברה by value של אובייקט. במקרה של המטריצה אתה ממש לא יכול לבצע את ההכפלה בצורה הזו ותיאלץ לעשות משהו כזה:
Matrix Matrix::eek:perator*( Matrix &lhs, Matrix &rhs) { Matrix tmp; // place code that does matrix multiplication // and stores it in tmp Return tmp; }​
יש מבין ?
 

אלדד28

New member
לא הסברתי את עצמי כראוי.

זה נכון שיש קריאות מיותרות ל-CTOR-ים ול-DTOR-ים, אבל הדבר הבעייתי ביותר הוא ההעברה BY VALUE. היא הדבר הכבד ביותר.
 

voguemaster

New member
אמממ

זה תלוי במה ההבדל בין קריאה ל-ctor לבין קריאה ל-copy ctor לא ? העברה by value = קריאה ל-copy ctor, לא ?
 
למעלה