如何宣告函式
julia為我們提供了一些編寫函式的方法。第乙個需要function和end關鍵字
function sayhi(name)
println("hi$name, it's great to see you!")
endfunction f(x)
x^2end
我們可以像這樣呼叫已宣告的函式:
sayhi(「c-3po」)
f(42)
或者,我們可以在一行中重宣告這些功能函式
sayhi2(name) = println("hi$name, it's great to see you!")
f2(x) = x^2
sayhi2("r2d2")
f2(42)
最後,我們還可以將這些函式宣告為「匿名」函式
ayhi3 = name -> println("hi$name, it's great to see you!")
f3 = x -> x^2
sayhi3 ("balabala")
f3(42)
julia中的鴨子模式
"if it quacks like a duck, it's a duck."
舉個例子, sayhi
sayhi(55595472)
f將在矩陣上工作
a = rand(3,3)
print(a)
f(a)
f 會處理像 "hi" 這樣的字串,因為 * 是為字串萬用字元
f("hi")
另一方面,f函式不適用於向量。與定義明確的a^2不同,向量v的v^2不是具有明確含義的代數運算。
v = rand(3)
f(v)
變異與非變異的函式
按照慣例,函式體會寫在 ! 後,去改變原函式的定義,但不要這麼做,看看sort與sort之間的區別
v = [3, 5, 2]
sort(v)
print(v)
sort(v)返回乙個排序陣列,該陣列包含於v相同的元素,但陣列v保持不變,另一方面,當我們執行sort!(v)時,v的內容也會發生改變,陣列v進行也會進行排序
sort!(v)
print(v)
julia 中的高階函式
mapmap是julia中的乙個高階函式,它將函式作為其輸入引數之一,例如:
map(f,[1,2,3])
將會輸出乙個陣列,其中函式f已經應用於所有元素[1,2,3],等效於:
[f(1),f(2),f(3)]
在這裡,我們將陣列[1,2,3]中的元素進行平方,怎麼做?
為此,我們可以傳遞給map匿名函式而不是命名函式,例如
x->x^3
map(x->x^3,[1,2,3])
現在,我們已經將所有元素進行了平方。
broadcast
broadcast是另乙個高階函式,就像map函式。broadcast是乙個概括的map函式,但它實現的功能比map的更多。呼叫broadcast的語法與呼叫map的語法相同
broadcast(f, [1, 2, 3])
再一次,我們通過「broadcast」 應用f(平方)所有元素[1, 2, 3]
呼叫broadcast函式的一些語法糖,.是在你想要的函式和它的輸入引數之間放置乙個broadcast。例如,
broadcast(f, [1, 2, 3])
是相同的
f.([1, 2, 3])
再次注意這與呼叫有何不同
f([1, 2, 3]) # error 會報錯
我們可以對向量的每個元素進行平方,但我們不能對向量求平方! 為了驗證這一點,讓我們來看看它們之間的區別
f(a)
和f.(a)
對於矩陣a:
a = [i + 3*j for j in 0:2, i in 1:3]
f(a)
和以前一樣,我們可以看到矩陣a,
f(a) = a^2 = a * a
另一方面,
b = f.(a)
包含所有條目a。
這種用於broadcast的點語法允許我們以看起來自然,更接近數學符號的方式編寫相對複雜的復合元素表示式。例如,我們可以寫
a .+ 2 .* f.(a) ./ a
用來代替
broadcast(x -> x + 2 * f(x) / x, a)
而且兩者的表現完全相同
留幾個練習題:
1.試著編寫乙個add_one()函式,在其輸入的引數加一
2.使用map或briadcast將矩陣a的每個元素遞增1並將賦值給變數a
3.使用briadcast .語法將矩陣中a的每個元素遞增1並將其儲存在變數a2中
Julia常用函式
轉化資料型別 繪圖注釋 直接在陣列後面新增乙個元素 push pts,xk pts是陣列,xk是要新增的元素 對陣列進行批處理 reduce 2,3,4 結果是9 可以用來做判斷的時候能用 if reduce 條件1,條件2,條件3 可以用來將函式的結果組合成乙個陣列 map x x 2,3,4,5...
Julia 矩陣計算
使用巨集 isdefined isdefined x x new value 自定義巨集 可以在賦值的時候,如果某個屬性變數沒有被賦值,則將值設定給某個變數 macro ifund exp local e exp isdefined main,e.args 1 e.args 1 esc exp en...
Julia對矩陣進行預先賦值
我們知道,對於matlab和julia 而言,預先賦值可以獲得更快的運算速度,特別是matlab.由於julia 經常用循還解決相關問題,預先賦值使用的頻率相比matlab而言大大減小。不過,還是有一些地方,可能用到的,盡量不要使用cat 操作,效率低下,速度慢得很。這個原則,還僅是對於matlab...