Vas*_*sac 3 matrix negate julia
我需要在Julia中将“非”运算符应用于零和一的矩阵。在Matlab中,我会这样做:
A=not(B);
Run Code Online (Sandbox Code Playgroud)
在Julia中,我尝试这样做:
A = .~ B;
Run Code Online (Sandbox Code Playgroud)
和
A = .! B;
Run Code Online (Sandbox Code Playgroud)
它应该将0变成1,将1变成0,但是结果是我出错了,或者所有矩阵元素都是一些我没有输入的负数。提前致谢!
问题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
Run Code Online (Sandbox Code Playgroud)
这里的关键部分是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
Run Code Online (Sandbox Code Playgroud)
要分解这里发生的事情:
iszero
是一个谓词,用于测试标量值是否为零!iszero
是一个谓词,如果标量值不为零,则返回(!iszero).(A)
!iszero
通过矩阵广播功能A
这将返回BitArray
带有期望的零(false)和一(true)模式的a。请注意,在数组上下文中,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
Run Code Online (Sandbox Code Playgroud)