CoCalc Shared Files07. Jupyter-ostalo / Julia.ipynbOpen in CoCalc with one click!
Author: Ivica Nakić

Julia

Julia je novi jezik, nastao 2012. godine. Julia je dinamički jezik koji se može kompajlirati te dobiti vrlo dobre performanse (često u rangu C-a). Ima sličnosti s Pythonom, ali i s Lispom. Prvenstvena namjena mu je znanstveno računanje, ali dizajniran je tako da i u domeni nespecijaliziranih programskih jezika može naći svoje mjesto.

In [1]:
VERSION
v"0.5.0"
In [2]:
f(x, y) = 1 + 2x*y^2
f (generic function with 1 method)
In [3]:
f(1,4)
33
In [4]:
α=3
3
In [5]:
println("α=", α)
α=3
In [6]:
μ=3 println("Sinus od $μ je $(sin(μ))")
Sinus od 3 je 0.1411200080598672
In [7]:
10^19
-8446744073709551616
In [8]:
BigInt(10)^19
10000000000000000000
In [9]:
a = Int8(1) b = Int8(2) a + b
3
In [10]:
typeof(ans)
Int8
In [11]:
typemax(Int64)
9223372036854775807
In [12]:
c = 1+3.5im
1.0 + 3.5im
In [13]:
c^2
-11.25 + 7.0im
In [14]:
c.re, c.im
(1.0,3.5)
In [15]:
3//4
3//4
In [16]:
typeof(ans)
Rational{Int64}
In [17]:
//(3, 4)
3//4
In [18]:
//
// (generic function with 7 methods)
In [19]:
methods(//)
7 methods for generic function //:
In [20]:
l = [3, 4, 5]
3-element Array{Int64,1}: 3 4 5
In [21]:
l[1]
3
In [22]:
l[1:2]
2-element Array{Int64,1}: 3 4
In [23]:
l[2:end]
2-element Array{Int64,1}: 4 5
In [24]:
l[1:end-1]
2-element Array{Int64,1}: 3 4
In [25]:
a = [1.1, 2.2, 3.3] b = [4.4, 5.5, 6.6]
3-element Array{Float64,1}: 4.4 5.5 6.6
In [26]:
dot(a,b)
38.72
In [27]:
(a,b)
38.72
In [28]:
a.*b
3-element Array{Float64,1}: 4.84 12.1 21.78
In [29]:
norm(a)
4.115823125451335
In [30]:
a⋅b
38.72
In [31]:
a×b
3-element Array{Float64,1}: -3.63 7.26 -3.63
In [32]:
Ψ = norm
norm (generic function with 9 methods)
In [33]:
Ψ(a)
4.115823125451335
In [34]:
?norm
search: norm normpath normalize normalize! normalize_string vecnorm issubnormal
norm(A, [p])

Compute the p-norm of a vector or the operator norm of a matrix A, defaulting to the p=2-norm.

For vectors, p can assume any numeric value (even though not all values produce a mathematically valid vector norm). In particular, norm(A, Inf) returns the largest value in abs(A), whereas norm(A, -Inf) returns the smallest.

For matrices, the matrix norm induced by the vector p-norm is used, where valid values of p are 1, 2, or Inf. (Note that for sparse matrices, p=2 is currently not implemented.) Use vecnorm to compute the Frobenius norm.

In [35]:
suma = 0 for i = 1:10 suma += i end println("Suma je $suma")
Suma je 55
In [36]:
kvadrati = [i^2 for i in [1:2:10; 7]]
6-element Array{Int64,1}: 1 9 25 49 81 49
In [37]:
M = [2 1; 1 1]
2×2 Array{Int64,2}: 2 1 1 1
In [38]:
M[:,1]
2-element Array{Int64,1}: 2 1
In [39]:
rand()
0.194052272230967
In [40]:
v = [1, 2]
2-element Array{Int64,1}: 1 2
In [41]:
M*v
2-element Array{Int64,1}: 4 3
In [42]:
dot(v,v)
5
In [43]:
M = rand(100, 100)
100×100 Array{Float64,2}: 0.823685 0.959533 0.914166 … 0.634468 0.55875 0.959321 0.888054 0.517168 0.98111 0.767699 0.0826222 0.313916 0.526687 0.452331 0.0186533 0.0750501 0.950221 0.484281 0.905193 0.477754 0.666308 0.119242 0.748496 0.510197 0.552254 0.845979 0.0635522 0.206468 0.405423 0.0730754 0.705777 0.759756 0.78426 … 0.64529 0.586206 0.902311 0.418558 0.349762 0.314765 0.442339 0.635466 0.157412 0.284421 0.396884 0.878606 0.218935 0.503469 0.309289 0.985913 0.545452 0.405668 0.494811 0.297475 0.961027 0.852446 0.388494 0.671127 0.275561 0.526394 0.730511 0.109036 0.497742 0.316859 … 0.847041 0.435709 0.434643 0.14566 0.0323608 0.874718 0.686789 0.065643 0.880529 0.439728 0.192207 0.0268152 0.473984 0.741708 0.937173 ⋮ ⋱ 0.994145 0.799665 0.13128 0.946506 0.79288 0.639039 0.752141 0.707233 0.288864 0.691256 0.343201 0.0835424 0.788981 0.0655596 0.262611 … 0.163575 0.36919 0.369076 0.203687 0.804314 0.487234 0.342588 0.184886 0.262782 0.449541 0.652579 0.0511055 0.165664 0.889631 0.408358 0.8354 0.584587 0.249332 0.380268 0.346006 0.719066 0.863734 0.436482 0.242159 0.979589 0.22725 0.840324 0.720361 0.284384 0.511806 … 0.761623 0.771165 0.849925 0.592886 0.905295 0.412045 0.360163 0.890909 0.644862 0.133634 0.384939 0.083474 0.528835 0.0508042 0.145624 0.97755 0.418905 0.169726 0.101553 0.657945 0.5839 0.381275 0.711899 0.174598 0.927804 0.690078 0.249492
In [44]:
@time lamb, vv = eig(M)
0.660276 seconds (405.51 k allocations: 17.288 MB, 1.26% gc time)
(Complex{Float64}[49.7051+0.0im,2.80627+0.901813im,2.80627-0.901813im,1.32752+2.54612im,1.32752-2.54612im,2.90142+0.0im,-2.91262+0.0524949im,-2.91262-0.0524949im,1.9868+1.79619im,1.9868-1.79619im … -0.794771-0.174447im,0.644836+0.419374im,0.644836-0.419374im,0.214759+0.0im,-0.577777+0.495315im,-0.577777-0.495315im,0.282011+0.582889im,0.282011-0.582889im,0.194124+0.168054im,0.194124-0.168054im], Complex{Float64}[-0.0986176+0.0im 0.055689-0.0109681im … -0.00190763+0.0860034im -0.00190763-0.0860034im; -0.097162+0.0im 0.00428767+0.00225751im … 0.017157-0.00893366im 0.017157+0.00893366im; … ; -0.0991484+0.0im -0.038184+0.0420319im … -0.0170382+0.0517033im -0.0170382-0.0517033im; -0.110852+0.0im 0.0604364+0.101726im … -0.00615236-0.136541im -0.00615236+0.136541im])
In [45]:
lu(M)
( [1.0 0.0 … 0.0 0.0; 0.205062 1.0 … 0.0 0.0; … ; 0.15923 -0.00455682 … 1.0 0.0; 0.996428 -0.45928 … 0.0728867 1.0], [0.994155 0.743064 … 0.196954 0.523056; 0.0 0.826546 … 0.361956 0.753536; … ; 0.0 0.0 … -5.56871 -1.357; 0.0 0.0 … 0.0 -0.714286], Int32[21,64,81,17,79,58,30,16,41,19 … 32,82,51,80,36,2,100,22,73,50])
In [46]:
norm(M)
49.90371178351387
In [47]:
function normakvadrata(M) norm(M^2) end
normakvadrata (generic function with 1 method)
In [48]:
normakvadrata(M)
2480.458037303798
In [49]:
Base.:+(s1::AbstractString, s2::AbstractString) = string(s1, s2)
In [50]:
"Prvi" + " drugi"
"Prvi drugi"
In [51]:
"Vrijednost od x je " + 3
MethodError: no method matching +(::String, ::Int64) Closest candidates are: +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:138 +(!Matched::Complex{Bool}, ::Real) at complex.jl:151 +(!Matched::Char, ::Integer) at char.jl:40 ...
In [52]:
Base.:+(s::AbstractString, x::Number) = s + "$(2x)"
In [53]:
"Vrijednost od x je " + 3
"Vrijednost od x je 6"
In [54]:
immutable Vector2D x::Float64 y::Float64 end
In [55]:
v = Vector2D(3, 4); w = Vector2D(5, 6);
In [56]:
v + w
MethodError: no method matching +(::Vector2D, ::Vector2D) Closest candidates are: +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:138
In [57]:
Base.:+(v::Vector2D, w::Vector2D) = Vector2D(v.x+w.x, v.y+w.y)
In [58]:
v+w
Vector2D(8.0,10.0)
In [59]:
Base.:*(v::Vector2D, α::Number) = Vector2D(v.x*α, v.y*α) Base.:*(α::Number, v::Vector2D) = Vector2D(v.x*α, v.y*α)
In [60]:
v * 3.5
Vector2D(10.5,14.0)
In [61]:
3.5 * v
Vector2D(10.5,14.0)
In [62]:
methods(+)
166 methods for generic function +:
In [63]:
function sum1(N::Int) total = 0 for i in 1:N total += i/2 end total end function sum2(N::Int) total = 0.0 for i in 1:N total += i/2 end total end
sum2 (generic function with 1 method)
In [64]:
sum1(10), sum2(10)
(27.5,27.5)
In [65]:
N = 10000000 @time sum1(N) @time sum2(N)
0.267848 seconds (30.00 M allocations: 457.764 MB, 15.53% gc time) 0.010801 seconds (5 allocations: 176 bytes)
2.50000025e13
In [66]:
code_typed(sum2, (Int,))
1-element Array{Any,1}: LambdaInfo for sum2(::Int64)
In [67]:
code_llvm(sum2, (Int, ))
define double @julia_sum2_72290(i64) #0 { top: %1 = icmp slt i64 %0, 1 br i1 %1, label %L2, label %if.preheader if.preheader: ; preds = %top br label %if L2.loopexit: ; preds = %if br label %L2 L2: ; preds = %L2.loopexit, %top %total.0.lcssa = phi double [ 0.000000e+00, %top ], [ %5, %L2.loopexit ] ret double %total.0.lcssa if: ; preds = %if.preheader, %if %total.04 = phi double [ %5, %if ], [ 0.000000e+00, %if.preheader ] %"#temp#.03" = phi i64 [ %2, %if ], [ 1, %if.preheader ] %2 = add i64 %"#temp#.03", 1 %3 = sitofp i64 %"#temp#.03" to double %4 = fmul double %3, 5.000000e-01 %5 = fadd double %total.04, %4 %6 = icmp eq i64 %"#temp#.03", %0 br i1 %6, label %L2.loopexit, label %if }
In [68]:
code_native(sum2, (Int,))
.text Filename: In[63] pushq %rbp movq %rsp, %rbp xorpd %xmm0, %xmm0 xorl %eax, %eax Source line: 14 testq %rdi, %rdi jle L56 movabsq $140600821612904, %rcx # imm = 0x7FE02E070168 movsd (%rcx), %xmm1 # xmm1 = mem[0],zero nopl (%rax) Source line: 15 L32: incq %rax xorps %xmm2, %xmm2 cvtsi2sdq %rax, %xmm2 mulsd %xmm1, %xmm2 addsd %xmm2, %xmm0 Source line: 14 cmpq %rax, %rdi jne L32 Source line: 18 L56: popq %rbp retq nopw (%rax,%rax)
In [69]:
using PyCall @pyimport numpy.random as nprandom nprandom.rand(3,4)
3×4 Array{Float64,2}: 0.641178 0.344351 0.386636 0.794118 0.0545324 0.969383 0.110949 0.453816 0.734294 0.963323 0.603344 0.0206484
In [70]:
objective = x -> cos(x) - x #ekvivalent lambda funkcijama u Pythonu
(::#3) (generic function with 1 method)
In [71]:
objective(1)
-0.45969769413186023
In [72]:
t = ccall( (:clock, "libc"), Int32, ())
19913557
In [73]:
function es(n::Int64) l = ones(Bool, n) l[1] = false for i in 2:int64(sqrt(n)) if l[i] for j in (i*i):i:n l[j] = false end end end return filter(x -> l[x],1:n) end
es (generic function with 1 method)