####使用宏@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
目前无法删除矩阵当中的行,根据Julia作者的解释应该是这样的:
不能从矩阵中删除行。事实上,Matlab有简单的语法,这有点陷阱,因为实际删除行的方式是创建一个没有行的副本,因此我们决定使其更具透明的性能特征。您可以更改一维数组的大小,例如执行push!(v,x)和pop!(v) 。
可以使用类似的方式过滤某一行
A[1:size(A,1) .!= 2,: ]
DataFrames 是可以删除的 ,它有一个deleterow!() 函数,可以删除指定的行,但是矩阵不可以。
#排除第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列
#第一种方式:
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)))
对于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
#合并行
a = vcat([1 2 3 4 5],[6 7 8 9 10; 11 12 13 14 15])
# 3×5 Array{Int64,2}:
# 1 2 3 4 5
# 6 7 8 9 10
# 11 12 13 14 15
#合并列
b = hcat([6 7; 8 9; 10 11; 12 13; 14 15],[1; 2; 3; 4; 5])
# 5×3 Array{Int64,2}:
# 6 7 1
# 8 9 2
# 10 11 3
# 12 13 4
# 14 15 5
a = reshape(1:15,3,5)
# 3×5 reshape(::UnitRange{Int64}, 3, 5) with eltype Int64:
# 1 4 7 10 13
# 2 5 8 11 14
# 3 6 9 12 15
#使用函数
transpose(a)
# 5×3 LinearAlgebra.Transpose{Int64,Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}}}:
# 1 2 3
# 4 5 6
# 7 8 9
# 10 11 12
# 13 14 15
#使用运算符
a'
# 5×3 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
# 1 6 11
# 2 7 12
# 3 8 13
# 4 9 14
# 5 10 15