יום ראשון, 16 בדצמבר 2012

מכחול ושרשרת ברזל | על Link Plot ו-Brush/Select Data


בתחילת החודש העברתי הרצאה במסגרת סמינר בנושא החידושים ב-MATLAB ו-Simulink בגרסאות האחרונות, ולקראת תום ההרצאה הצגתי שקף ובו סקירה של טיפים וטריקים בעבודה עם MATLAB. מפאת קוצר הזמן, לא הייתי יכול להדגים או להסביר כל טיפ וטריק, ולכן ביקשתי מהנוכחים לבחור כמה מראשי הפרקים שבשקף אשר נשמעים להם מעניינים ואשר היו מעוניינים שארחיב עליהם. הקהל בחר ב-Link Plot וב-Brush/Select Data, ובהם יעסוק פוסט זה.

לא רבים יודעים, אך באמצעות Link-Plot ניתן לקשר בין גרף לבין המשתנים שמהם הוא הופק, כך ששינוי של המשתנים יביא לעדכון של הגרף (מבלי שיהיה צורך להפעיל שוב פעם את פקודת ציור הגרף). בנוסף, ניתן אפילו לבצע שינויים במידע על גבי הגרף, כך שהללו יבואו לידי ביטוי גם בגרף וגם במשתנים אשר מהם הוא נוצר (וזאת על ידי Brush/Select Data). והנה דוגמה...

נניח שהפקנו גרף של עשר נקודות במישור X-Y אשר הוגרלו מפילוג אחיד בתחום [0,1] (לחצו על התמונה כדי להגדילה):

ניתן לקשר בין הגרף לבין המשתנים שמהם הוא הופק באמצעות לחצן ה-Link Plot שבתפריט ה-Figure

אם נלחץ עליו, ולמשל נשנה את קואורדינטת ה-X הראשונה ל-5, הגרף יתעדכן בהתאם, מבלי שיהיה צורך להפעיל שוב את פקודת scatter:

משמאל ללחצן ה-Link Plot מופיע לחצן ה-Brush/Select Data

כשלוחצים על הלחצן הזה, ניתן לסמן עם העכבר נקודות בגרף, כך שסימון הנקודות יהיה שקול לבחירת התאים המתאימים (ב-Variable Editor) מתוך המידע אשר שימש להפקת הגרף:

ומה אפשר לעשות עם זה? הרשימה המלאה של האפשרויות מופיעה כאשר מקליקים עם הלחצן הימני של העכבר על גבי אחת מהנקודות:

אפשר, למשל, לייצר משתנה חדש מתוך כל הנקודות שמעניינות אותנו (Create Variable), להסיר את הנקודות שמפריעות לנו (Remove) או להחליף את ערכיהן בערכים אחרים (Replace with). למרות שאני מתקשה לחשוב על מקרה שבו נרצה לגרום לנתונים להיראות טובים יותר...

למידע נוסף:
Data Brushing
Data Linking

יום רביעי, 5 בדצמבר 2012

שובם של ה-System Objects

בשלוש שנות קיומו של הבלוג הזה, השתדלתי כמה שפחות למחזר פוסטים. אבל בפוסט הנוכחי אחרוג ממנהגי, מכמה סיבות:
1. חלפו שנתיים וחצי מאז הפוסט האחרון בנושא שבו ארצה לדון
2. בתקופה הזו הנושא התפתח מאוד
3. חברת MathWorks רואה בנושא הזה מרכיב חשוב בתוכניותה לעתיד
4. מעט מאוד אנשים נחשפו לנושא הזה עד כה (בכל פעם שאני שואל את הקהל שאני ניצב מולו האם אנשים מכירים את הנושא, בודדים, אם בכלל, משיבים "כן").

הנושא הינו System Objects, אלגוריתמים העומדים מאחורי אובייקטים הקיימים בסביבת MATLAB כבר 6 גרסאות (מאז גרסת R2010a). כשכתבתי על כך לפני שנתיים וחצי, היו קיימים רק כ-140 אובייקטי מערכת, ורק בתחומים עיבוד אות, עיבוד וידאו, עיבוד תמונה וראיה ממוחשבת. כיום, קיימים כבר כ-330 אובייקטי מערכת, המשמשים ל:
1. עיבוד אות - מעל 95 אובייקטי מערכת ב-DSP System Toolbox
2. עיבוד וידאו, עיבוד תמונה וראיה ממוחשבת - מעל 60 אובייקטי מערכת ב-Computer Vision System Toolbox
3. פיתוח השכבה הפיזית של מערכות תקשורת - מעל 105 אובייקטי מערכת ב-Communications System Toolbox
4. תכנון, סימולציה וניתוח של מערכות מכ"מ, מערכות Ultrasound ומערכות תקשורת מרובות-אנטנות - מעל 60 אובייקטי מערכת ב-Phased Array System Toolbox

לאלה מכם המכירים Simulink, ה-System Objects מאפשרים גישה לחלק משמעותי מאלגוריתמים אשר בעבר היה ניתן להפעיל רק באמצעות Simulink, כך שבגישת אובייקטי המערכת ניתן כיום להשתמש באותם אלגוריתמים ללא צורך בידע ב-Simulink או ברישיון לכלי. בהקשר הזה יודגש כי קיימים גם אובייקטי מערכת אשר אין להם בלוק תואם בסביבת Simulink (למשל, אובייקט המערכת המאפשר גילוי פנים בתמונה, אשר נידון בעבר בבלוג זה). כלומר, שימוש ב-System Objects מאפשר לכם להשתמש באלגוריתמים רבים אשר לא זמינים עבורכם בדרכים אחרות !

להבדיל מפונקציות MATLAB, אשר הינן מסוג "y שווה לפונקציה של x", ה-System Objects מסוגלים לעבוד עם קלט משתנה (Streams) וכן מסוגלים לספק מידע על המצבים הפנימיים של הפונקציה. בכך הם מרחיבים את שפת MATLAB באופן המאפשר למדל מערכות דינמיות באמצעות שפה טקסטואלית, ומהווים מעין "גשר" המקשר בין MATLAB ל-Simulink. כמובן שאם כתבתם אלגוריתם ב-MATLAB העושה שימוש ב-System Objects, אתם מוזמנים לנסות להכניס אותו לתוך בלוק ה-MATLAB Function ב-Simulink על מנת לשלבו כחלק ממודל בסביבה הזו.

מבחינת ביצועים – נניח ואתם מעוניינים לבצע Edge Detection לפריימים השונים בסרטון וידאו. בעוד ששימוש בפונקציית edge בתוך לולאה העוברת בין הפריימים השונים יהיה כרוך בקריאה לאותה פונקציה בכל פעם מחדש (דבר אשר כרוך באיתחולים חוזרים ונישנים), עבודה עם אובייקט המערכת vision.EdgeDetector ומתודת step אמורה להיות יעילה יותר. בנוסף, כמה System Objects המשתייכים ל-Communications System Toolbox ול-Phased Array System Toolbox ניתנים להאצה על ידי שימוש ב-GPU (הכרטיס הגרפי של המחשב), תוך שינוי מזערי של הקוד הכתוב.  אם כך, System Objects אמורים להביא לקיצור זמני הריצה של אלגוריתמים ! 

System Objects עשויים להקל על אלה מכם המנסים לבצע סימולציות Fixed-Point בסביבת MATLAB, וכן על מי שמנסה להמיר בקלות קוד MATLAB לקוד C או HDL. כבר כיום יש תמיכה ביצירת קוד C/HDL מתוך מגוון System Objects - למשל, כל
ה-System Objects שבגרסת R2012b של ה-Communications System Toolbox נתמכים ליצירה אוטומטית של קוד C. בהקשר זה, חשוב לציין כי החל מגרסת R2011b יכול כל אחד לפתח System Objects משלו, אשר יוכלו להתממשק אל אלה שפיתחה MathWorks, והחל מגרסת R2012a ניתן להמיר לקוד C כאלה אובייקטי מערכת שהמשתמש פיתח.


System Objects הוא נושא שאני ממליץ לכל אחד להתחיל ללמוד אותו וליישם אותו, שכן כבר היום הם נכללים בחלק גדול מכלי MathWorks - פרט להיותם חלק ממשפחת ה-System Toolboxes (אותם ארבעה כלים שהוזכרו לעיל ואשר קיימים מגרסת R2011a), יש כיום אובייקטי מערכת גם בכלים Image Acquisition Toolbox (אובייקט המאפשר רכישת תמונה הנתמך ליצירה אוטומטית של קוד C) ו-HDL Verifier (אובייקט המאפשר לבצע סימולציות FPGA-in-the-loop תוך שימוש ב-MATLAB ו-FPGA בלבד). וכפי שנכתב קודם, MathWorks מתכוונת להמשיך לפתח את הנושא הזה בשנים הבאות.

לרשימת ה-System Objects בארבעת ה-System Toolboxes המוזכרים לעיל, לחצו על הקישורים הבאים:
DSP
Computer Vision
Communications
Phased Array