3

我需要将“非”运算符应用于 Julia 中的零和一矩阵。在 Matlab 中,我会这样做:

A=not(B);

在 Julia 我尝试这样做:

A = .~ B;

A = .! B;

它应该将零变为一,将一变为零,但结果我得到错误,或者所有矩阵元素都是一些我没有输入的负数。提前致谢!

4

4 回答 4

7

问题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)BitArrayBool,它的否定显然是很好定义的。从这个意义上说,您还可以使用B = Bool.(A)将所有元素转换为布尔值。

于 2019-10-28T16:14:56.353 回答
6

对于从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
于 2019-10-28T16:33:27.820 回答
3

您也可以自己滚动:

not(x) = (x |> Bool |> !) |> Float64

定义了一个方法,该方法将转换xboolean,不应用,然后将结果转换回数字。not.(A)将对数组按元素进行操作A。这里|>将输出重定向到下一个方法并与广播一起使用。

于 2019-10-29T03:45:56.107 回答
2

虽然在概念上不是最干净的,但A=1.-B会做你想做的事。问题~在于它不是对整数执行按位运算,这会产生负数。不知道有什么问题,!除了它可能应该是!.B

于 2019-10-28T16:03:18.493 回答