如何将非运算符应用于 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 进行操作。这里 |> 将输出重定向到下一个方法并使用广播。