מבוא למחשב בשפת matlab

14
תתתת תתתתת תתתתMatlab תתתתת14 : תתתת תתתתת12 : ןןן ןןןן ןןןן- ןןןן ןן

Upload: vala

Post on 08-Jan-2016

49 views

Category:

Documents


3 download

DESCRIPTION

מבוא למחשב בשפת Matlab. הרצאה 14 : חזרה הרצאה 12:. נכתב על-ידי שלמה מורן. שאלות חזרה. שאלה 1 (25 נק '): 1. (5 נק ') תת מטריצה רציפה של מטריצה M היא תת מטריצה המורכבת מרצף של שורות ועמודות של M . כתבו פונקציה g המקבלת כפרמטרים מטריצה M וארבעה אינדקסים: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: מבוא למחשב בשפת  Matlab

Matlabמבוא למחשב בשפת

: חזרה14הרצאה

:12הרצאה

נכתב על-ידי שלמה מורן

Page 2: מבוא למחשב בשפת  Matlab

2

שאלות חזרה

נק'(:25 )1שאלה

 

היא תת מטריצה המורכבת מרצף M נק'( תת מטריצה רציפה של מטריצה 5. )1 Mהמקבלת כפרמטרים מטריצה g. כתבו פונקציה Mשל שורות ועמודות של

וארבעה אינדקסים:

fromRow, toRow, fromColumn, toColumn על הפונקציה להחזיר . התחומה ע"י אותם אינדקסים. Mתת-מטריצה רציפה של

 

תחזיר את g(M,1,3,2,3)לדוגמא, עבור המטריצה להלן, הקריאה תת-המטריצה )הרציפה( המסומנת במסגרת העבה.

14הרצאה

1 -5 1 1-1 5 2 5-2 2 1 1

function N = g(M, fromRow, toRow, fromColumn, toColumn)

N = M(fromRow:toRow,fromColumn:toColumn)תשובה:

Page 3: מבוא למחשב בשפת  Matlab

14הרצאה 3

function maxVal = f(M)

if isempty(M)

;

else

[r,c] = size(M);

maxVal = max([ , ,

, ,

]);

end

המקבלת כפרמטר f נק') להלן קוד חלקי של פונקציה רקורסיבית 10ב. (מטריצת מספרים, ומחזירה את סכום תת-המטריצה הרציפה המקסימלי האפשרי,

. על 0כמו בדוגמה להלן. לצורך זה, סכום של תת מטריצה ריקה הוא מהסעיף הקודם.gלהשתמש בפונקציה fהפונקציה

1 -5 1 1-1 5 2 0-2 2 1 1-2 2 2 -2

עליכם להשלים את הקוד שלהלן.

Page 4: מבוא למחשב בשפת  Matlab

14הרצאה 4

function maxVal = f(M)

if isempty(M)

maxVal=0 ;

else

[r,c] = size(M);

maxVal = max([ sum(sum(M)), f(g(M,2,r,1,c)) ,

f(g(M,1,r,2,c)) ,f(g(M,1,r-1,1,c)), f(g(M,1,r,1,c-1))] );

end

Page 5: מבוא למחשב בשפת  Matlab

5

נק'( מהו מספר הקריאות הרקורסיביות שהפונקציה תבצע:8)ג.

. על מטריצת קלט עם שורה אחת ועמודה אחת? 1

. על מטריצת קלט עם שתי שורות ועמודה אחת? 2

הסבירו כיצד הגעתם לתשובתכם.

תשובה:

ראשית נשים לב שעל מטריצה ריקה לא מתבצעת אף קריאה רקורסיבית. על מטריצה 1. 4 קריאות רקורסיביות,שכל אחת מהן על מטריצה ריקה. סה"כ 4 יתבצעו 1x1בגודל

קריאות.

1x1 על מטריצה בגודל 2 קריאות רקורסיביות, מהן 4 יתבצעו 2x1על מטריצה בגודל 2.12 = 0*2 + 4*2 + 4ושתיים על מטריצות ריקות. סה"כ

14הרצאה

function maxVal = f(M)

if isempty(M)

maxVal=0 ;

else

[r,c] = size(M);

maxVal = max( [ sum(sum(M)), f(g(M,2,r,1,c)) ,

f(g(M,1,r,2,c)) , f(g(M,1,r-1,1,c)), f(g(M,1,r,1,c-1))] );

end

Page 6: מבוא למחשב בשפת  Matlab

6

n מספר הקריאות הרקורסיביות שהפונקציה תבצע עבור קלט עם T(n,m) נק'): יהי 8(ד.

עמודות:mשורות ו

מהו בסיס הרקורסיה בו מספר הקריאות מחושב באופן ישיר, ומהו מספר זה. 1.

m=0. T)0,m( = T)n,0( = 0 או n=0כאשר המערך ריק, כלומר תשובה: בסיס הרקורסיה הוא

> i+j כך ש T(i,j) באמצעות ערכי T(n,m). עבור המקרים האחרים, בטאו את הערך של 2m+n.

, יש ארבע קריאות רקורסיביות: בשתיים מהן "מוחקים" 0 גדולים מn וגם mתשובה: כאשר גם שורה ובשתיים מהן "מוחקים" עמודה. מתקבל

T)n,m( = 4+ 2*T)n-1,m( + 2*T)n,m-1(

14הרצאה

function maxVal = f(M)

if isempty(M)

maxVal=0 ;

else

[r,c] = size(M);

maxVal = max( [ sum(sum(M)), f(g(M,2,r,1,c)) ,

f(g(M,1,r,2,c)) , f(g(M,1,r-1,1,c)), f(g(M,1,r,1,c-1))] );

end

Page 7: מבוא למחשב בשפת  Matlab

5תשובות לשאלות מתרגיל בית

( :calculate.m )1משימה

 

)function r = calculate)n, d, kכתבו פונקציה

n 0 הוא מספר שלם חיובי או .d - 0 הוא ספרה בודדת השונה מ .kהוא מספר שלם חיובי

.1גדול או שווה

d את הספרה nהפונקציה מחזירה כתוצאה מספר שלם חיובי אשר מתקבל כאשר מוסיפים ל –

, אזי יתווספו אפסים בין הספרהn יותר גדול ממספר הספרות ב – k-י מימין. אם kבמקום ה –

. k לבין nהשמאלית של

43654 נקבל כתוצאה )calculate ) 4354, 6, 3 : עבור 1דוגמה

 

 

14הרצאה 7

function r = calculate(n,d,k) %%r is the number esulted by inserting digit d at the k-th location from%%the right in n eg calculate(3245, 9,4) = 39245. right_side = rem(n,10^(k-1));left_side = floor(n/10^(k-1))*10^k;r = right_side+d*10^(k-1)+left_side;

Page 8: מבוא למחשב בשפת  Matlab

( :sum_zero.m) 2משימה function r = sum_zero(a) כתבו פונקציה

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

(.false לוגי )0אם לא הפונקציה תחזיר  דוגמה : עבור המערך

-34- 15- 15- 2 1 3 9 15 33 37 37 39 42 42 43 אשר סכומם הוא אפס.15, -15 כיוון שקיימים 1התוצאה היא

דרישות :  אסור לשנות את תוכן המערך )גם לא באופן זמני(.

.reshape או repmat ולא ב – findאסור להשתמש בפונקציות של מטלאב על מערכים, ובפרט לא ב – .lengthמותר להשתמש ב –

.מותר להשתמש בלולאה אחת בלבד לכל היותר

14הרצאה 8

function r = sum_zero(a)%%a is a sorted array. r is true iff it contains two elements which sum to%%0. at most one loopn=length(a);r=0;for i=1:n-1 b=[a(i+1:end),a(1:i)]; if any(a+b==0) r=1;return endend

Page 9: מבוא למחשב בשפת  Matlab

:3משימה

( :check_line.mחלק א ) 

 

)function r = check_line)lineכתבו פונקציה

 line.הוא מערך שורה לא ריק של מספרים שלמים

כאשר n עד 1 מופיעים כל המספרים השלמים בתחום lineהפונקציה בודקת האם ב –

n הוא האורך של line.

(.false )0( או true )1בהתאם מוחזר

  

14הרצאה 9

function r = check_line(line) %%%%%check if all numbers from 1 to n appearr = true;for i=1:length(line) if ~any(line==i) r=false; return endend

Page 10: מבוא למחשב בשפת  Matlab

( :check_square.mחלק ב )

 

)function r = check_square)squareכתבו פונקציה

 square.הוא מערך דו מימדי ריבועי לא ריק של מספרים שלמים

כאשר n עד 1 מופיעים כל המספרים השלמים בתחום squareהפונקציה בודקת האם ב –

n - הוא מספר האיברים ב square.

(.false )0( או true )1בהתאם מוחזר

דרישה :  

הקפידו על תכנות מודולרי. השתמשו בצורה מושכלת בחלק א.

 

14הרצאה 10

function r = check_square(square) %%%%%check if all numbers from 1 to n appearr = check_line(square(:));

Page 11: מבוא למחשב בשפת  Matlab

( :check_soduko.mחלק ג )

 

)function r = check_soduko)table, nכתבו פונקציה

 

table.הוא מערך דו מימדי ריבועי לא ריק של מספרים שלמים

.n-soduko הוא לוח חוקי של משחק tableהפונקציה בודקת האם

(.false )0( או true )1בהתאם מוחזר

 

התנאים הבאים צריכים להתקיים עבור לוח כזה :

n2 x n2  גודלו של הלוח -

)כולל(. n2 עד 1 בכל שורה מופיעים כל המספרים בתחום

)כולל(.n2 עד 1 בכל עמודה מופיעים כל המספרים בתחום

)כולל(.n2 עד 1 בכל תת ריבוע מתאים מופיעים כל המספרים בתחום

כאשר :

n x n הלוח מחולק לתת ריבועים באופן כזה שגודלו של כל תת ריבוע הוא

תת ריבועים כאלה.n2 וכל תת הריבועים צמודים זה לזה ומכסים את כל הלוח. סך הכל יש

14הרצאה 11

Page 12: מבוא למחשב בשפת  Matlab

function r = check_soduku(table,n) %%%%%check if table is legal soduku of order n^2 by n^2r=1;if size(table)~=[n^2,n^2],r=0; return,endfor i=1:n^2 %check rows if ~check_line(table(i,:)) r=0; return endendfor i=1:n^2 %check columns if ~check_line(table(:,i)) r=0; return endendfor i=1:n:n^2% check squares for j=1:n:n^2 if ~check_square(table(i:i+n-1,j:j+n-1)) r=0; return end endend

14הרצאה 12

Page 13: מבוא למחשב בשפת  Matlab

5 תרגיל בית 6שאלה

  

להלן האלגוריתם הרקורסיבי השני לחישוב מספרי פיבונאצ'י שהוצג בהרצאה:

 

1. function [f1, f0] = myfib_fast_rec)n(

2. if ) n <= 2(

3. f0 = 1;

4. f1 = 1;

5. else

6. [f1, f0] = myfib_fast_rec)n - 1(; % f0=fibonacci)n-2(, f)1(=fibonnaci)n-1(

7. [f1, f0] = deal)f1 + f0, f1(; % f0 = fibonacci)n-1(, f)1(=fibonnaci)n(

8. end

 

n המתבצעות במהלך ביצוע הפונקציה עבור קלט myfib_fast_rec כמספר הקריאות לפונקציה )H)nנגדיר

.H)1( = H)2( =0. הסבירו, על סמך הקוד, מדוע 1

.H)n( = n-2 מתקיים: n>1. הוכיחו באינדוקציה כי עבור 2

14הרצאה 13

Page 14: מבוא למחשב בשפת  Matlab

.H)1( = H)2( =0הסבירו, על סמך הקוד, מדוע 1.

.H)n( = n-2 מתקיים: n>1הוכיחו באינדוקציה כי עבור 2.

תשובה 

.n=2 לא מתבצעת קריאה רקורסיבית ולכן לא מתקיימת אף קריאה. אותו כנ"ל כאשר n=1כאשר 3.

הוכחה באינדוקציה:. 2

.1 נובע מסעיף n=2בסיס: עבור .n, נוכיח עבור n-1, נניח נכונות עבור n>2שלב מעבר: נניח ש

H)n-1( = )n-1(-2 = n-3 פרושה: n-1נכונות עבור . n-1 עם פרמטר קריאה רקורסיבית אחת לפונקציה6 תנאי העצירה לא מתקיים, ולכן מתבצעת בשורה n>2עבור

n( = H)n-1(+1(H קריאות במהלך ביצוע הקריאה הרקורסיבית. כלומר )H)n-1בנוסף לכך מתבצעות

H)n( = H)n-1(+1 =) n-3(+1 = n-2ומכאן ההוכחה:

 

14הרצאה 14

1. function [f1, f0] = myfib_fast_rec(n)2. if ( n <= 2)3. f0 = 1;4. f1 = 1;5. else6. [f1, f0] = myfib_fast_rec(n - 1); % f0=fibonacci(n-2), f(1)=fibonnaci(n-1)7. [f1, f0] = deal(f1 + f0, f1); % f0 = fibonacci(n-1), f(1)=fibonnaci(n)8. end