שאלה על לולאות בMatlab

James Devlin

New member
שאלה על לולאות בMatlab

האם אפשר איכשהו לכתוב את הקוד הבא ללא לולאות?


for ix=1:width1
for jx=1:height1
inputPoints=[inputPoints; leftUpperCornerY + ix , leftUpperCornerX + jx ];
targetPoints= [targetPoints ; leftUpperCornerY + YY(ix,jx), leftUpperCornerX + XX(ix,jx) ];
end
end


leftUpperCornerY ו leftUpperCornerX הם מספרים.

YY וXX הן מטריצות, XX(ix,jx) zzz מחזיר סתם מספר שאני צריך.

הרעיון זה לקבל מערך עם height*width שורות ושתי עמודות.

תודה!
 

James Devlin

New member
שאלה נוספת בC++

היי,

נתקלתי בקוד שמוגדת בו הפונ'

void setPara(const DImage& im_s,const DImage& im_d){Im_s=im_s;Im_d=im_d;};


מה משמעות הconst וה& שם? לא מצאתי הסברים שהצלחתי להבין בגוגל..

הקוד למעלה, ההגדרה של Im_s ו Im_d היא:

DImage Im_s,Im_d;


שיניתי אותה כך ש DImage *Im_s,*Im_d; כלומר, המשתנים הם עכשיו מערכים של DImage. אני לא מצליח לשנות את הפונ' שהעתקתי למעלה כך שהקוד לפחות יתקמפל. אפשר הסבר לגבי מה בדיוק המשמעות של הconst וה& ואיך לשנות את הפונ' אם המשתנים הם כעת מערכים?

תודה מראש!!
 
ובכן

המשמעות של ה-& היא העברת הפניה, כלומר לא נוצר אובייקט חדש כשקוראים לפונקציה, אלא הפונקציה מקבלת הפניה לאובייקט המקורי.
המשמעות של ה-const היא שהפונקציה לא יכולה לשנות את האובייקט. החשיבות של זה גדולה במיוחד כשמעבירים הפניה, כי אם מעבירים עותק ממילא הפונקציה לא יכולה לשנות את האובייקט המקורי.

אחרי השינוי שלך המשתנים הם מצביעים ולא מערכים. אני מניח שאתה מתכוון שהם מצביעים לתחילת מערך.
אי אפשר להשים אובייקט לתוך מצביע. בהנחה שאתה רוצה להשים את האובייקט לאיבר הראשון במערך, פשוט כתוב lm_s[0]=im_s
 

James Devlin

New member
תודה, אבל אני רוצה לשנות

גם את החתימה של הפונ'.

Im_s ו Im_d אכן מצביעים לתחילת המערך. אני רוצה שהפונ' תקבל מצביעים, אבל אני לא מצליח להבין איפה לשים את ה* ביחס לconst. ניסיתי את המימוש הבא:

void setPara(const DImage*& im_s,const DImage*& im_d){Im_s=im_s;Im_d=im_d;};


ואני מקבל שגיאה Cannot convert from 'const DImage *' to 'DImage *' zzzz.

מה הבעיה כאן?

תודה מראש!
 
ובכן

אתה לא יכול להשים מצביע לקבוע בתוך מצביע למשתנה רגיל (כי זה יאפשר לשנות את הקבוע).

חוץ מזה, כשאתה מעביר מצביע לקבוע, מיותר להעביר הפניה. אתה יכול למחוק את ה-&.
 

James Devlin

New member
עוד שאלה בC

היי,

אני לא מבין מה המשמעות של השורה הבאה:

T_message*& message=pSpatialMessage[t][plane][offset1*nNeighbors+direction].data();


message הוא פוינטר ל T_message, אבל בהשמה הכתובת שלו בזיכרון (בגלל ה&) מקבלת ערך? הוא לא אמור פשוט להצביע לdata. אף פעם לא ראיתי סינטקס כמו:

int *& a = something;


יש לזה משמעות מיוחדת? a הוא מצביע לint שמשנים את הכתובת שלו (לא את ההצבעה שלו)?

תודה מראש!
 

BravoMan

Active member
כי זה לא C אלא עדיין ++C

message הוא לא מצביע ל-T_message אלא "הפניה" או "ייחוס" (reference) למצביע ל-T_massege.

בצורה המופשטת זה היה נראה כך:

int *a;
int * &b = a;


עכשיו b מחזיק ב-reference ל-a, כלומר הלכה למעשה הם כאילו אותו משתנה, וכל כתובת שתשים ב-b, למשל b = NULL למעשה תיכנס ל-a וכמובן שכל שינוי שתעשה ל-a ישתקף ב-b.
 

James Devlin

New member
אנסה להבהיר את השאלה

בהינתן שתי מטריצות XX,YY מגודל 3X3, איך אני מייצר את המטריצה הבאה:

[XX(1,1) YY(1,1); XX(1,2) YY(1,2);XX(1,3) YY(1,3); XX(2,1) YY(2,1); XX(2,2) YY(2,2); XX(2,3) YY(2,3); XX(3,1) YY(3,1); XX(3,2) YY(3,2); XX(3,3) YY(3,3)]


הכוונה כמובן ללא שימוש בלולאות ומבלי לכתוב אותה מפורשות..


תודה מראש!!
 
למעלה