Re: [問題] 陣列 divide by zero已回收
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章