我需要将“非”运算符应用于 Julia 中的零和一矩阵。在 Matlab 中,我会这样做:
A=not(B);
在 Julia 我尝试这样做:
A = .~ B;
和
A = .! 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
这里的关键部分是 a 的元素类型 ( eltype
)BitArray
是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
是一个谓词,如果标量值不为零则返回(!iszero).(A)
!iszero
在矩阵上广播函数A
这将返回BitArray
具有所需模式的零(假)和一(真)。请注意,在数组上下文中,假打印为0
,真打印为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
。这里|>
将输出重定向到下一个方法并与广播一起使用。
虽然在概念上不是最干净的,但A=1.-B
会做你想做的事。问题~
在于它不是对整数执行按位运算,这会产生负数。不知道有什么问题,!
除了它可能应该是!.B