Julia ---- 矩陣計算

1、如何判斷一個屬性是否被初始化

####使用宏@isdefined
(@isdefined x) || (x = NEW_VALUE)

####自定義宏 ,可以在賦值的時候,如果某個屬性變量沒有被賦值,則將值設置給某個變量
macro ifund(exp)
    local e = :($exp)
    isdefined(Main, e.args[1]) ? :($(e.args[1])) : :($(esc(exp)))   
end

z=2 #2
@ifund z=1  #還是2

####但是要注意作用域
t
#UndefVarError: t not defined
#top-level scope

#這裏雖然賦值成功
for i=1:10 t = "$(@ifund t="") $i" end
#但是這裏依然會報錯,因爲上面賦值的t作用域只有在for循環中
t
#UndefVarError: t not defined
#top-level scope


2 矩陣刪除一行

目前無法刪除矩陣當中的行,根據Julia作者的解釋應該是這樣的:
不能從矩陣中刪除行。事實上,Matlab有簡單的語法,這有點陷阱,因爲實際刪除行的方式是創建一個沒有行的副本,因此我們決定使其更具透明的性能特徵。您可以更改一維數組的大小,例如執行push!(v,x)和pop!(v) 。
可以使用類似的方式過濾某一行

 A[1:size(A,1) .!= 2,: ]

DataFrames 是可以刪除的 ,它有一個deleterow!() 函數,可以刪除指定的行,但是矩陣不可以。

3、選擇指定行數據

#排除第2行,其他所有的數據,.!= 表示不除去某行,其中end 也可以使用size(B,1) 替代
B = A[1:end .!= 2,:]
#只選擇第2行
B = A[[2],:]

size(B)
#(1, 3)
size(B,1)
#1 就上面的tuple (1, 3)中的1
size(B,2)
# 3 就上面的tuple (1, 3)中的3

#同樣對列的操作也是類似的
C = A[:, 1:end .!= 2] #排除第2列
C = A[:, [2]] #只選第2

4、有兩個矩陣 t1 t2 ,現在要從t1中找到小於t2的 首行,

#第一種方式:
findfirst(all, collect(eachrow(t1 .<= t2)))

#第二種方式:
#返回的是矩陣的一列
all(t1 .<= t2; dims=2)
# 3×1 BitArray{2}:
#  0
#  1
#  0

findfirst(all(t1 .<= t2; dims=2))
#CartesianIndex(2, 1)

#拿到CartesianIndex的 第一個參數就是 指定的 行  #2
findfirst(all(t1 .<= t2; dims=2))[1]

#第三種方式:
findfirst(vec(all(t1 .<= t2; dims=2)))

5 、對矩陣 取邏輯非 操作 ,即not 或者 !

對於Int 或者其他數值類型的矩陣來說 直接 用 !操作是不合法的,需要轉換爲BitArray

julia> A = rand(0:1, 5,5)
5×5 Array{Int64,2}:
 0  0  0  1  1
 0  1  0  0  1
 0  1  1  1  0
 1  1  0  0  0
 1  1  1  0  0

julia> B = BitArray(A)
5×5 BitArray{2}:
 0  0  0  1  1
 0  1  0  0  1
 0  1  1  1  0
 1  1  0  0  0
 1  1  1  0  0

julia> .!B
5×5 BitArray{2}:
 1  1  1  0  0
 1  0  1  1  0
 1  0  0  0  1
 0  0  1  1  1
 0  0  0  1  1

B = Bool.(A)
# 5×5 BitArray{2}:
#  1  0  1  0  0
#  0  0  1  1  0
#  0  1  0  1  0
#  1  1  1  0  0
#  0  1  0  1  1

#或者
A .!= 0
# 5×5 BitArray{2}:
#  1  0  1  0  0
#  0  0  1  1  0
#  0  1  0  1  0
#  1  1  1  0  0
#  0  1  0  1  1

#又或者使用iszero函數
(!iszero).(A)
# 5×5 BitArray{2}:
#  1  0  1  0  0
#  0  0  1  1  0
#  0  1  0  1  0
#  1  1  1  0  0
#  0  1  0  1  1

6、矩陣排序

發佈了94 篇原創文章 · 獲贊 74 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章