如何将非运算符应用于 Julia 中的所有矩阵元素?
How to apply not operator to all matrix elements in Julia?
我需要将 "not" 运算符应用于 Julia 中的零和一矩阵。
在 Matlab 中我会这样做:
A=not(B);
在 Julia 中,我尝试这样做:
A = .~ B;
和
A = .! B;
它应该将 0 变为 1,将 1 变为 0,但结果出现错误,或者所有矩阵元素都是一些我没有输入的负数。
提前致谢!
虽然在概念上不是最干净的,A=1.-B
会做你想做的事。 ~
的问题在于它不是对整数执行按位运算,这会产生负数。不确定 !
有什么问题,但它可能应该是 !.B
A = .!B
的问题是逻辑非 !(::Int64)
没有为整数定义。这是有道理的:!3
应该合理给予什么?
既然您想执行逻辑运算,那么为什么要从整数开始工作还有更深层次的原因吗?
您也许可以使用 BitArray
来代替,这样效率要高得多,并且在大多数操作中应该表现得像常规 Array
。
您可以轻松地将整数矩阵转换为 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
这里的关键是BitArray
的元素类型(eltype
)是Bool
,对于它的否定显然是明确定义的。从这个意义上说,您还可以使用 B = Bool.(A)
将所有元素转换为布尔值。
对于从 A
(其中 A
是一个数字矩阵)到一个布尔矩阵的一般解决方案,其中其他地方有零值和假值,您可以这样做:
julia> A = rand(0:3, 5, 5)
5×5 Array{Int64,2}:
1 0 1 0 3
2 0 1 1 0
2 1 1 3 1
1 0 3 0 3
1 3 3 1 2
julia> (!iszero).(A)
5×5 BitArray{2}:
1 0 1 0 1
1 0 1 1 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
分解这里发生的事情:
iszero
是测试标量值是否为零的谓词
!iszero
是一个谓词 returns 如果标量值不为零
(!iszero).(A)
在矩阵 A
上广播 !iszero
函数
此 returns 一个 BitArray
具有所需的零(假)和一(真)模式。请注意,在数组上下文中,false 打印为 0
,true 打印为 1
(它们在数值上相等)。您还可以像这样与数字 0
进行比较:
julia> A .!= 0
5×5 BitArray{2}:
1 0 1 0 1
1 0 1 1 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
您也可以自己滚动:
not(x) = (x |> Bool |> !) |> Float64
定义一个方法,将 x
转换为 boolean
,不应用,然后将结果转换回数字。 not.(A)
将按元素对数组 A
进行操作。这里 |>
将输出重定向到下一个方法并使用广播。
我需要将 "not" 运算符应用于 Julia 中的零和一矩阵。 在 Matlab 中我会这样做:
A=not(B);
在 Julia 中,我尝试这样做:
A = .~ B;
和
A = .! B;
它应该将 0 变为 1,将 1 变为 0,但结果出现错误,或者所有矩阵元素都是一些我没有输入的负数。 提前致谢!
虽然在概念上不是最干净的,A=1.-B
会做你想做的事。 ~
的问题在于它不是对整数执行按位运算,这会产生负数。不确定 !
有什么问题,但它可能应该是 !.B
A = .!B
的问题是逻辑非 !(::Int64)
没有为整数定义。这是有道理的:!3
应该合理给予什么?
既然您想执行逻辑运算,那么为什么要从整数开始工作还有更深层次的原因吗?
您也许可以使用 BitArray
来代替,这样效率要高得多,并且在大多数操作中应该表现得像常规 Array
。
您可以轻松地将整数矩阵转换为 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
这里的关键是BitArray
的元素类型(eltype
)是Bool
,对于它的否定显然是明确定义的。从这个意义上说,您还可以使用 B = Bool.(A)
将所有元素转换为布尔值。
对于从 A
(其中 A
是一个数字矩阵)到一个布尔矩阵的一般解决方案,其中其他地方有零值和假值,您可以这样做:
julia> A = rand(0:3, 5, 5)
5×5 Array{Int64,2}:
1 0 1 0 3
2 0 1 1 0
2 1 1 3 1
1 0 3 0 3
1 3 3 1 2
julia> (!iszero).(A)
5×5 BitArray{2}:
1 0 1 0 1
1 0 1 1 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
分解这里发生的事情:
iszero
是测试标量值是否为零的谓词!iszero
是一个谓词 returns 如果标量值不为零(!iszero).(A)
在矩阵A
上广播
!iszero
函数
此 returns 一个 BitArray
具有所需的零(假)和一(真)模式。请注意,在数组上下文中,false 打印为 0
,true 打印为 1
(它们在数值上相等)。您还可以像这样与数字 0
进行比较:
julia> A .!= 0
5×5 BitArray{2}:
1 0 1 0 1
1 0 1 1 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
您也可以自己滚动:
not(x) = (x |> Bool |> !) |> Float64
定义一个方法,将 x
转换为 boolean
,不应用,然后将结果转换回数字。 not.(A)
将按元素对数组 A
进行操作。这里 |>
将输出重定向到下一个方法并使用广播。