Matrix 如何将not算子应用于Julia中的所有矩阵元素?

Matrix 如何将not算子应用于Julia中的所有矩阵元素?,matrix,julia,negate,Matrix,Julia,Negate,我需要对Julia中的0和1的矩阵应用“not”操作符。 在Matlab中,我会这样做: A=not(B); 在朱莉娅,我试着这样做: A = .~ B; 及 它应该将0变为1,将1变为0,但我得到的结果是错误的,或者所有矩阵元素都是我没有输入的负数。 提前谢谢 虽然在概念上不是最干净的,A=1.-B会做你想做的事。~的问题是,它对整数执行按位not运算,从而产生负数。不知道有什么问题了除了它可能应该是!。B与A=.有关的问题。!这是逻辑否定吗!(::Int64),不是为整数定义的。这是有道

我需要对Julia中的0和1的矩阵应用“not”操作符。 在Matlab中,我会这样做:

A=not(B);
在朱莉娅,我试着这样做:

A = .~ B;

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

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

A=.有关的问题。!这是逻辑否定吗!(::Int64)
,不是为整数定义的。这是有道理的:应该说,
!3
合理给出

既然您想执行逻辑运算,那么您为什么要从整数开始呢

您也许可以使用
位数组
,它的效率要高得多,并且在大多数操作中应该像常规的
数组

您可以轻松地将整数矩阵转换为
位数组
。之后,应用逻辑逻辑逻辑并不能像预期的那样工作

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

这里的关键部分是
位数组
的元素类型(
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
    是一个谓词,如果标量值不是零,则返回该谓词
  • (!iszero)。(A)
    广播
    !iszero
    矩阵上的函数
    A
这将返回一个
位数组
,其中包含所需的0(假)和1(真)模式。请注意,在数组上下文中,假打印为
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
,不应用,然后将结果转换回数字<代码>非。(A)
将在数组
A
上按元素操作。此处
|>
将输出重定向到下一个方法,并使用广播

A=1.-B
是个好主意!我没想到。它完成了任务。我试过了!。B`,也是,但它不起作用。感谢您的智能解决方案!非常感谢您的详细回答!我现在完全明白了。我只想对0和1执行逻辑求反,我知道它不是为整数定义的,但我不知道如何执行,而且存在BitArray命令。。。谢谢你的回答!我想推荐
BitArray
稍微掩盖一下这个问题。如果只有0和1,请使用
Bool.(B)
将所有元素转换为可以执行逻辑操作的逻辑值。在大多数情况下,它确实也会返回一个
位数组
,但在IMO中,它为什么会这样做也就更清楚了。换句话说,它根本与数组类型无关!这是关于元素类型的。@MattB。非常感谢你!我也会试试。谢谢你的评论。我会更新我的答案,并尝试澄清一些事情。谢谢你的好选择!我也要试试。今天我确实学到了很多关于朱莉娅的事情!非常感谢你!爱你的解决方案!我也会用这个逻辑。顺致敬意,
not(x) = (x |> Bool |> !) |> Float64