MATLAB

היסטוריה

השם MATLAB הוא ראשי תיבות של המילים "מעבדת מטריצות" - "matrix laboratory" באנגלית. MATLAB נכתב בסוף שנות ה-70 על ידי קליב מולר, אז ראש המחלקה למדעי המחשב באוניברסיטת ניו מקסיקו. מטרת התוכנית הייתה מתן גישה לספריות המתמטיות LINPACK ו-EISPACK ללא צורך ללמוד Fortran. התוכנה נפוצה במהירות באוניברסיטאות ובקהילת חוקרי המתמטיקה השימושית. ג'ק ליטל, מהנדס, גילה את התוכנה כאשר ביקר את מולר באוניברסיטת סטנפורד במהלך 1983. ליטל הכיר בפוטנציאל המסחרי, וצירף את מולר וסטיב באנגרט. הם כתבו מחדש את התוכנה בשפת C (ספריות משוכתבות אלו ידועות כ-JACKPAC) וייסדו את Mathworks ב-1984, על מנת להמשיך את פיתוחה. 
התוכנה אומצה תחילה על ידי חוקרים ועובדים בהנדסת מכשור ובקרה, תחום המומחיות של ג'ק ליטל, אבל במהירות נפוצה לתחומים שונים. התוכנה נמצאת בשימוש נרחב באקדמיה, במיוחד בנושאי הלימוד של אלגברה ליניארית ואנליזה נומרית, והיא נפוצה גם בין המדענים העוסקים בעיבוד תמונה, רשתות נוירונים מלאכותיות, סימולציות של תהליכים פיזיקליים, חישובים נומריים ותחומים נוספים. סטודנטים רבים להנדסה ומדע נחשפים לתוכנה זו במהלך לימודיהם.

סביבת פיתוח

MATLAB מכילה מספר יכולות עבור פיתוח אלגוריתמים, כולל יכולות של פיתוח מונחה עצמים. כמו כן התוכנה כוללת סביבת פיתוח משולבת המכילה כלי ניפוי שגיאות וחקר ביצועים. בנוסף התוכנה יכולה לתקשר עם אמצעים אלקטרוניים ממוחשבים.

הצגת נתונים

התוכנה מגיעה עם יכולות גרפיות, הכוללות תצוגה בשלושה ממדים (ראו גרפיקה בהמשך), ניתוח נתונים ויזואלי ויצירת קליפים.
סביבת הפיתוח המשולבת מאפשרת יצירה של ממשקי משתמש עם פקדים שונים (לדוגמה כפתורים, שדות נתונים להזנה). באמצעות שימוש במהדר, ניתן ליצור באמצעות ממשקים אלו תוכנה נפרדת היכולה לרוץ, ודורשת רק את ספריית זמן הריצה של MATLAB.

ממשקים

התוכנה כוללת מספר ממשקי תכנות יישומים עבור גישה לספריות הנכתבות בשפות תכנות אחרות (באמצעות קובצי MEX או DLL) ללקוחות COM וממשקי Web, כמו גם אביזרים היקפיים המתקשרים ישירות עם התוכנה באמצעות הממשק הטורי.

חבילות כלים

ב-MATLAB ניתן ליצור חבילה מיוחדת המרחיבה את הפונקציונליות של התוכנה. קבוצות של כלים כאלו נכתבו ב-MATLAB על מנת לפתור סוגים מסוימים של בעיות, כאשר חברת MathWorks מספקת מספר חבילות כאלו כמו: עיבוד אותות, עיבוד תמונות, רשתות נויורונים, בקרה, אופטימיזציות, לימוד מכונה ועוד. אלפי חבילות נוספות פותחו על ידי חברות אחרות.

תחביר

התוכנה בנויה סביב שפת MATLAB, המכונה לפעמים גם קוד M. הדרך הפשוטה ביותר להשתמש בשפה היא להקישה ליד הסמן >> בחלון הפקודה, שהוא חלק מסביבת העבודה של התוכנה, ולהשתמש בתוכנה כמעטפת מתמטית. רצף של פקודות ניתן לרישום בקובץ טקסט, לרוב על ידי העורך הפנימי, כסקריפט או כפונקציה. ניתן גם להשיג הרחבות לשפה ואף להשתמש בה כשפה מונחה עצמים.

משתנים

משתנים מוגדרים עם אופרטור ההשמה (=). השפה היא בעלת טיפוסים חלשים, כך שאין צורך בהגדרה של הטיפוסים והם אף יכולים להשתנות. ערכים יכולים להיות מחושבים באמצעות קבועים, ערכי משתנים אחרים ומתוצאות של פונקציות. ב-MATLAB יש מספר קבועים, בהם pi שמייצג את פאי ו-i שמייצג מספר היחידה המדומה . למשל: 
>> x = 17x =
 17>> x = 'hat'x =hat>> x = [3*4, pi/2]x =
 12.0000 1.5708>> y = 3*sin(x)y =
 -1.6097 3.0000>> r = 2 * pir =
   6.2832A = [3+2i 7-8i]>> A =
   3.0000 + 2.0000i   7.0000 - 8.0000i>> tol = 3 * epstol =
   6.6613e-016>> intmax('uint64')ans =
   18446744073709551615

כפל

הכפל הסטנדרטי ב-MATLAB, האופרטור , הוא כברירת מחדל כפל מטריצות. עם רוצים לכפול איבר-איבר יש להשתמש באופרטור 
. ראו דוגמאות להלן:
>> A = [1 2; 3 6], B = [0 3 ; 2 1]A =
     1     2
     3     6B =
     0     3
     2     1>> P1 = A*B, P2=A.*BP1 =
     4     5
    12    15P2 =
     0     6
     6     6>> V = [1 3], V*V', V.*VV =
     1     3ans =
    10ans =
     1     9

אופרטורים לוגיים

הקוד שלהלן מציג את אופרטורי ההשוואה העיקריים: שווה (==), לא שווה (=~), קטן שווה (=>) וגדול שווה (=<). הקוד מחזיר 1 לוגי אם התנאי הלוגי נכון ו-0 לוגי אחרת.
% equal, not equal, less or equal, greater than or equal>> Rel = [ 1==1, 1~=1, 1 <= 2, 3 >= 2 ]Rel =
     1     0     1     1
באמצעות אופרטורים בינאריים אפשר ליצור ביטויים לוגיים מורכבים. הסימון ~ מייצג NOT, הסימון & מייצג AND, הסימון | מייצג OR. ראו דוגמה להלן:
% Logical not, and, or, xor>> BinOps = [ ~(1==0) , (1==1) & (2==2), (0==1) | (0==0) , xor(1>2,2>1) ]BinOps =
     1     1     1     1
ניתן להשתמש באופרטורים && (וגם) ו- || (או), שיעילים יותר חישובית מ-& ו-|.
% Logical not, and, or, xor>> BinOps = [ ~(1==0) , (1==1) && (2==2), (0==1) || (0==0) , xor(1>2,2>1) ]BinOps =
     1     1     1     1

נקודה פסיק

בשפות תכנות רבות אחרות, סימן הנקודה פסיק נדרש על מנת לסיים משפטים. ב־MATLAB סימן זה איננו חובה. אם משפט איננו מסתיים עם סימן זה, אז תוצאתו תוצג. אם משפט זה לא מחזיר במפורש תוצאה, למשל 'clc', אזי לסימן אין השפעה.

גרפיקה

הפונקציה plot משמשת ליצירת גרף משני וקטורים x ו־y. הקוד: 
x = 0:pi/100:2*pi;y = sin(x);plot(x,y)
יוצר את הגרף הבא של פונקציית הסינוס:
 
גרפיקה תלת ממדית יכולה להיווצר על ידי שימוש בפונקציות surf, plot3 או mesh, למשל הקוד:
[X,Y] = meshgrid(-8:.5:8);R = sqrt(X.^2 + Y.^2)+eps;Z = sin(R)./R;surf(X,Y,Z)
יוצר תצוגה תלת ממדית של הפעלת הפונקציה sinc על הרדיוס:
את הגרפים ניתן לעצב או באמצעות הקלדת קוד לתוך התוכנית או במסך הפקודות, או באמצעות ממשק משתמש גרפי בחלון המציג את הגרף. את הגרף ניתן לשמור במספר פורמטים, בהם PNG, ולהשתמש בהם בתוכנות אחרות או להוסיפם למאמרים ומסמכים שונים.

מגבלות

ב־MATLAB אין מערכת מרחבי שם, כמו זו הנמצאת בשפות מודרניות כ־Java ו־פייתון, כך שניתן לנקוב בשמן המלא (למשל java.lang.system.out.println). ב־MATLAB, כל הפונקציות הן מטווח השמות הגלובלי, וסדר הקדימות של פונקציות עם אותו שם נקבעות על פי סדר הגדרתן ועל פי כללים שונים. כתוצאה מכך, שני משתמשים יכולים לקבל תוצאות שונות עבור אותו קוד אם נתיב החיפוש הוא שונה.
הרבה פונקציות הן בעלת התנהגות שונה עם מטריצה ווקטור ומאחר שווקטורים הם מטריצה של שורה או עמוד, עובדה זאת יכולה לגרום לתוצאות בלתי צפויות. לדוגמה, הפונקציה (sum(A כאשר A היא מטריצה נותן וקטור שורה המכיל את הסכום של כל עמודה ב־A, לעומת זאת (sum(v כאשר v הוא וקטור עמודה או שורה מחזירה את הסכום של רכיביו; משום כך המתכנת צריך להיזהר אם המטריצה יכולה להתנוון מערך חד ממדי. בזמן ש־sum והרבה פונקציות דומות יכולות לקבל ארגומנט הקובע את הכיוון, אחרות, כמו plot לא יכולות, ונדרשות בדיקות נוספות. 
אף על פי שטיפוסים אחרים זמינים, ברירת המחדל היא מטריצה של נקודה צפה בדיוק כפול. טיפוס מערך זה לא כולל דרך להצמיד תכונות כגון יחידות או קצב דגימה. אף על פי שסימן זמן הוסף ב־R14SP3 עם אובייקט time series, קצב דגימה עדיין לא נתמך ומאפיינים כאלו חייבים להיות מנוהלים דרך מבנים או פונקציות שירות.