在 Julia 中存取物件的欄位的時候,設計者會想要對於存取的過程中加上一些檢查,這個想法是來自於傳統物件導向 getter/setter 的概念。

例如,在自己設計的物件當中有兩個矩陣,這兩個矩陣可以讓使用者隨意更新,但是需要保證這兩個矩陣的維度是一致的。這個時候就需要在使用者更新矩陣的時候加入檢查,以確保兩個矩陣之間的維度是一致的,如果檢查不通過,可能會跳例外或者是不讓矩陣被更新。

繼續閱讀

這幾年,隨著接觸的東西變多,知道的東西變多,個性上也有點變化。

約莫四五年前,碩班時期接觸到一些很棒的網路技術文章,當時線上課程也非常熱門,很多優秀的大學紛紛把他們的上課內容做成教材釋出。也因為這樣,我自己其實從這些網路資源受惠非常多。當時也是自己在發展自學能力的輝煌時期。

繼續閱讀

這個問題在官方文件中並沒有詳細記載,所以覺得值得紀錄一下。

查閱 @async 的文件會講說,他會用一個 Task 把後面的表達式包裝起來,並且將他掛到排程器的佇列(queue)中。意思就是將表達式包裝成一個任務,並放到佇列中等待 CPU 核心的資源來執行他。

繼續閱讀

Linux 系統降噪

之前在 Linux 上測試麥克風,發現錄製的時候總會把背景雜訊給錄進去,會在有人講話的同時聽到雜音。

我用的是 OBS 來做桌面錄製,所以自然想用 OBS 來做音訊的降噪。在 OBS 裡有噪音閥及噪音抑制,似乎噪音閥的效果比較明顯,但是講話聲音背後仍有雜音。

這時候在網路上找了一下,發現可以用系統 pulseaudio 的驅動來做降噪,只是要特別設定開啟,預設是不會開啟的。試了之後效果超好,在這邊紀錄一下。

步驟

首先,編輯以下檔案

1
sudo nano /etc/pulse/default.pa

把以下這行加到檔案中,建議可以加到有個 Echo Cancellation 的地方:

load-module module-echo-cancel

重載 PulseAudio (pulseaudio -k) 就可以囉!

Ref: https://askubuntu.com/questions/18958/realtime-noise-removal-with-pulseaudio

留言與分享

我們都知道要將兩個 Array 接起來要用 append!,要將兩個 Set 合併起來要用 union!,但要將 Dict 合併起來要用什麼呢?

答案是 merge

merge

廢話不多說,我們看範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
julia> a = Dict(:a => "A", :b => "B")
Dict{Symbol,String} with 2 entries:
:a => "A"
:b => "B"

julia> b = Dict(:c => "C", :d => "D")
Dict{Symbol,String} with 2 entries:
:d => "D"
:c => "C"

julia> merge(a, b)
Dict{Symbol,String} with 4 entries:
:a => "A"
:b => "B"
:d => "D"
:c => "C"

merge 可以將兩個 Dict 合併起來,並且產生一個新的 Dict

有另一個函式 merge! 可以支援 in-place 版本的合併。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
julia> a
Dict{Symbol,String} with 2 entries:
:a => "A"
:b => "B"

julia> merge!(a, c)
Dict{Symbol,String} with 3 entries:
:a => "A"
:b => "C"
:d => "D"

julia> a
Dict{Symbol,String} with 3 entries:
:a => "A"
:b => "C"
:d => "D"

重複的鍵(key)

如果要合併的兩個字典當中有重複的鍵出現的話,會發生什麼事呢?

1
2
3
4
5
6
7
8
9
10
julia> c = Dict(:b => "C", :d => "D")
Dict{Symbol,String} with 2 entries:
:b => "C"
:d => "D"

julia> merge(a, c)
Dict{Symbol,String} with 3 entries:
:a => "A"
:b => "C"
:d => "D"

答案是會被後者蓋掉。

NamedTuple

merge 也可以用在 NamedTuple 上。

1
2
3
4
5
6
7
8
julia> a = (a="A", b="B")
(a = "A", b = "B")

julia> b = (c="C", d="D")
(c = "C", d = "D")

julia> merge(a, b)
(a = "A", b = "B", c = "C", d = "D")

mergewith (require v1.5 and above)

接下來介紹一個更好用的函式 mergewith

上面我們介紹的 merge 遇到相同的鍵,會把彼此蓋掉的行為,但有時候我們希望他們可以合併。

不囉唆,我們看範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
julia> a = Dict(:a => 1, :b => 2)
Dict{Symbol,Int64} with 2 entries:
:a => 1
:b => 2

julia> c = Dict(:b => 3, :d => 4)
Dict{Symbol,Int64} with 2 entries:
:b => 3
:d => 4

julia> mergewith(+, a, c)
Dict{Symbol,Int64} with 3 entries:
:a => 1
:b => 5
:d => 4

我們可以指定一個 aggregate function,如果遇到相同的鍵時,就把他們的值相加起來。

這個 aggregate function 可以是其他的,如此就可以處理多樣的資料。

mergewith 一樣有 in-place 版本 mergewith!

curry function

最神奇的是,mergewith 有類似 curry function 的行為。

1
2
3
4
5
6
7
8
julia> mergewith(+)(a, c)
Dict{Symbol,Int64} with 3 entries:
:a => 1
:b => 5
:d => 4

julia> mergewith(+)
#140 (generic function with 1 method)

你可以先給他一個 aggregate function,他會回傳一個匿名函式。

你可以拿這個匿名函式用在其他物件上。

留言與分享

Yueh-Hua Tu

目標是計算生物學家!
Systems Biology, Computational Biology, Machine Learning
Julia Taiwan 發起人


研發替代役研究助理


Taiwan