星期一, 11月 06, 2006

本週作業3.1 吳子青

--------------------------本週作業3.1 吳子青--------------------------
1. for i=1:50, A(i)=i^2; end; A=reshape(A,5,10) Find A. Is there any better way to find the same result?
題旨與分析:由前三行A為1x50的矩陣,元素為從1到50的平方之後經過reshape指令將A轉換為5x10矩陣,而有很多指令或方式可以作矩陣變形的動作,在這裡舉出一些想法。
程式流程與內容:Case 1: 定義每個元素的關係式,利用兩個迴圈跑出5x10的矩陣,為傳統沒有矩陣運算時的方法。 for m=1:5for n=1:10A(m,n)=(5*(n-1)+m)^2;endendclear n;clear m;
Case 2: 先宣告A的大小為5x10矩陣,再利用一個1: 50的迴圈依次填入,用的性質是matlab特有 A( 2,3 )也可用A (5)指定數值的性質
A=zeros(5,10); for i=1:50A(i)=i^2;end;
Case 3: 先做出一從1到50的5x10矩陣,之後在利用點 平方(.^2)直接對矩陣作運算
reshape([1:50],5,10).^2
執行結果:三者都會得到同樣的結果
Columns 1 through 71 36 121 256 441 676 9614 49 144 289 484 729 10249 64 169 324 529 784 108916 81 196 361 576 841 115625 100 225 400 625 900 1225
Columns 8 through 10
1296 1681 21161369 1764 22091444 1849 23041521 1936 24011600 2025 2500
討論:用各種不同的矩陣運算方式都可以得到相同的結果,在這裡就可以見到marlab在矩陣運算強大處
2. Let A=magic(5). Replace the elements that are larger than 10 with 'NaN'
題旨與分析:A=magic(5)會宣告一個5x5的魔術矩陣,將矩陣裡面大於10的元素以‘NaN’取代,在這裡可以用find指令找到矩陣裡大於10的元素的位置,直接宣告這些位置的元素為NaN
程式流程與內容:A=magic(5);A(find(A>=10))=NaN;A
A =
NaN NaN 1 8 NaN NaN 5 7 NaN NaN 4 6 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN 2 9
執行結果:A =
NaN NaN 1 8 NaN NaN 5 7 NaN NaN 4 6 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN 2 9
討論:在A裡面可以直接用算式取代位置變數,相當方便
3. Replace the prime elements in Prob 2 with 0.
題旨與分析:同第二題只是把NaN以0取代
程式流程與內容:
clearA=magic(5);A(find(A>=10))=0;A
A =
0 0 1 8 0 0 5 7 0 0 4 6 0 0 0 0 0 0 0 3 0 0 0 2 9
執行結果:A= 0 0 1 8 0 0 5 7 0 0 4 6 0 0 0 0 0 0 0 3 0 0 0 2 9
討論:在A裡面可以直接用算式取代位置變數,相當方便
4. The function draw_number is shown in sec 3.3. Please make a comparison of results when no_of_draw=[100:100:1000]?
題旨:draw_number 是從0~9取樣n次然後隨機放在5類中,比較取樣100次200次~1000次,看分佈和取樣數目的關係。我想這個題目的重點應該是,怎樣處理能夠讓電腦產生的隨機變數能符合題意所指,也就是10種取樣機率是相同的。
分析:在這裡測試了兩種隨機變數設定圖4-1 fix(rand*10)http://photos1.blogger.com/blogger2/2907/859880749988154/1600/fix.jpg
圖4-2 round(rand*10)http://photos1.blogger.com/blogger2/2907/859880749988154/1600/fix.jpg
從圖4-1可以看到用rand*10產生0~10之間的隨機亂數,用fix正整數化在 0、1、2… 9共10個整數是平均分配,所以符合我們的要求。
程式流程:Step 1:設定 draw_number(no_of_draw) 的function
Step 2:用迴圈從no_of_draw=100跑到1000
程式內容/draw_number.m/function [C]=draw_number(no_of_draw)% draw ball numbers within ndraw times%C=zeros(1,5);n=1;while n<=no_of_draw ball=fix(rand*10); if ball<2 C(1)=C(1)+1; elseif ball<4, C(2)=C(2)+1; elseif ball<6, C(3)=C(3)+1; elseif ball<8, C(4)=C(4)+1; else C(5)=C(5)+1; end n=n+1;end
/command windows/for n=1:10draw(1,n)=draw_number(100*n)end
結果:
22 17 24 18 19 32 36 43 53 36 61 60 52 61 66 92 75 76 82 75 120 94 105 91 90 112 113 113 139 123 146 138 123 153 140 161 154 143 165 177 179 174 185 189 173 190 211 183 208 208討論:因為樣本數太少,所以很難看出選擇方式是否夠逢機,不過從前面的圖上來看,應該是這樣。
5. Please use while...end statement to find out the chances to obtain a preset two-digit number which will be similar to the number set drawn from function rand().
題旨:利用while 和 end的組合寫一個程式,求抽出某一個二位數和電腦亂數選出來的數字相同的機率。
分析:在這裡二位數定義為10~99的數字,我的作法是每個數字亂數投10000次,紀錄當投出來的數字等於某二位數字的累積次數,第一部就是創造一個從10~99可以逢機的亂數,用while指令紀錄累積次數。
程式內容:
clear;clc;P=zeros(1,90);num=[10:99];for N=10:99 m=0; for i=1:10000 while N==fix(rand*89)+10 m=m+1; end; end; P(1,N-9)=m;
end;clear N;clear i;clear m;
結果:10000次的結果http://photos1.blogger.com/blogger2/2907/859880749988154/1600/10000.jpg
100000次的結果http://photos1.blogger.com/blogger2/2907/859880749988154/1600/100000.jpg
1000000次的結果http://photos1.blogger.com/blogger2/2907/859880749988154/1600/1000000.jpg

沒有留言: