如何不将运算符应用于Julia中的所有矩阵元素?

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,但是结果是我出错了,或者所有矩阵元素都是一些我没有输入的负数。提前致谢!

crs*_*nbr 6

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

  • 我觉得推荐`BitArray`可以使这个问题变得模糊。如果只有0和1,则使用`Bool。(B)`将所有元素转换为可以进行逻辑运算的逻辑值。的确,在大多数情况下,它确实也返回了一个BitArray,但是它也更清楚了_为什么要这样做IMO。 (2认同)

Ste*_*ski 5

对于从数字矩阵从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)