Re: [問題] 關於Select的用法
※ 引述《qoodeva (發呆的花枝)》之銘言:
: 不好意思小弟又來請教版上高手了= ="
: 1.
: 若有一串數列為
: {3.4,3+6i,3-6i,-3.4}
: 我只想要複數的虛部以及其他實數
: {3.4,6i,-6i,-3.4}
: 2.又有一串數列為正負根
: {3.4,3+6i,3-6i,-3.4}
: 只想選取正根值
: {3.4,6i}
: 如果使用Im或Re選取,只能選單一選擇複數的實部跟虛部,
: 看官網的Flash動畫有介紹到Select這個語法,
: 那改用Select不知後面的判別式要如何寫
: 推 LPH66:2.有點看不太懂...對虛數你想做什麼? 02/28 16:19
: → LPH66:1.感覺有點像是 Apply (/@) 運用的地方 02/28 16:19
: → LPH66: Map (記錯了, 那個運算子是 Map 才對) 02/28 16:20
: 2.的地方是因為是一微分方程式的根值,為兩個正負根(±3.4,3±6i)
: 但我只需要正值就好,所以3±6i這個複數我只需要用到虛部 6i,
: 前面那個3可以併到常係數裡
這樣的話我們可以分兩步來做 (正好就是你的 1. 和 2.)
首先是 1. 這裡我提到它是 Map 運用的地方
Map 的功能就是把一個函數作用到陣列中的每個元素上
例如 f /@ {a,b,c} 會得到 {f[a],f[b],f[c]}
這部份可以參考我的 #1EiPGgzs 這篇文章
觀察到這裡其實有著 實數→不動 這樣的對應
複數→取出虛部
那麼就可以寫成這樣:
In[1] := v = {3.4, 3+6I, 3-6I, -3.4};
In[2] := If[Im[#] == 0, #, Im[#] * I]& /@ v
Out[2] = {3.4, 6I, -6I, -3.4}
In[2] 的前半段到 & 為止是純函式 #1EiPGgzs 也有講解
這個純函式做的事是 若它是實數→就是它自己
否則(它是虛數)→取出虛部再乘上 I
也就是實接照著上面觀察到的對應在寫
再來 2. 的部份才是 Select 上場的時候了
你要在前面的結果中選出值是正的部份
Select 的寫法在第二個參數是個判斷函式 它會挑出代進判斷函式會得到 True 的值
那麼這裡再運用一個純函式就可以寫成:
In[3] := Select[%, If[Im[#] == 0, # > 0, Im[#] > 0]&]
Out[3] = {3.4, 6I}
% 的意思應該不用多說了
後面的純函式做的是這樣的判斷 實數→看它是否為正
虛數→看虛部是否為正
---
不過如果還不習慣寫純函式的話寫普通的函式也是可以的:
In[4] := Takeout[x_] := If[Im[x] == 0, x, Im[x] * I]
In[5] := CheckPositive[x_] := If[Im[x] == 0, x > 0, Im[x] > 0]
In[6] := Takeout /@ v
Out[6] = {3.4, 6I, -6I, -3.4}
In[7] := Select[%, CheckPositive]
Out[7] = {3.4, 6I}
In[4]~In[7] 這幾行和上面的 In[2]~In[3] 做的是一樣的事情
這樣你也可以更好理解 Select 在做什麼:
In[7] 這句就是把 % (Out[6])當中 CheckPositive[值] 會回傳 True 的值挑出來
--
1985/01/12 三嶋鳴海 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町
つぐみ 歡迎來到 1994/05/21 高江ミュウ 1997/03/24 守野いづみ 1997/03/24 伊野瀬
チサト 1998/06/18 守野くるみ 打越鋼太郎的 1999/10/19 楠田ゆに 2000/02/15 樋口遙
2002/12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 ∞與∫的世界 2011/04/02 茜崎空
啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞 2019/04/01~07 某大學合宿
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.230.62
推
02/28 18:17, , 1F
02/28 18:17, 1F
討論串 (同標題文章)
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章