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

7、矩阵合并

#合并行
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

8、矩阵转置

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

October-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值