Re: [問題] 陣列 divide by zero已回收

看板MATLAB作者 (小小書僮)時間16年前 (2008/09/26 06:23), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《VIATOR (小小書僮)》之銘言: : 小弟是新手,想請教一個問題, : 當我使用陣列做除法的時候, : t=(1:5); : A=t; : B=t-3; : C=A./B : 其中B裡面有一個數值是0, : 請問我有辦法用if 或其他指令挑出該數值, : 以其他數值取代, : 使得陣的除法仍然使用嗎? : 例如: : t=(1:5); : A=t; : B=t-3; : if B==0, B=0.1 : C=A./B : end : 我知道上面這樣是錯的, : 請問有類似的方法可以解決嗎? 網路上找到答案了,自問自答: 特殊MATLAB數值eps(這個值大約是2.2e-016)來取代陣列內的0元素。這個 特殊的表示法有時候在避免除以0時會很有用,如下例所示, >> x=(-3:3)/3 x = -1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000 >> sin(x)./x Warning: Divide by zero. ans = 0.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.8415 計算函式sin(x)會產生警告訊息因為第五個資料點為0。因為sin(0)/0是未定義的, MATLAB傳回在結果的位置上NaN(代表非數值,Not-a-Number)。這可以由eps取代0來避 免,例如, >> x=x+(x==0)*eps; >> sin(x)./x ans = 0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415 現在sin(x)/x在x=0會傳回正確的限制解。你可以用另外一種方式來避免計算x=0,例如, >> x=(-3:3)/3 % 重新建立x x = -1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000 >> y=ones(size(x)) % 建立預設的輸出值 y = 1 1 1 1 1 1 1 >> tf=x~=0 % 找出非0的位置 tf = 1 1 1 0 1 1 1 >> y(tf)=sin(x(tf))./x(tf) % 只在非0位置上作運算 y = 0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415 雖然與增加eps到x上相比之下,上面可能看起來有點煩人,用部份選定的陣列來避免計算 的概念,通常會在有效率的MATLAB程式設計被使用。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 68.190.223.78

09/26 06:25, , 1F
蠻有用的資訊,謝謝
09/26 06:25, 1F

09/26 15:19, , 2F
:)
09/26 15:19, 2F
文章代碼(AID): #18t0zFQ3 (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #18t0zFQ3 (MATLAB)