Vas*_*sac 3 matrix negate julia
我需要在Julia中将“非”运算符应用于零和一的矩阵。在Matlab中,我会这样做:
A=not(B);
在Julia中,我尝试这样做:
A = .~ B;
和
A = .! B;
它应该将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
这里的关键部分是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
要分解这里发生的事情:
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
| 归档时间: | 
 | 
| 查看次数: | 84 次 | 
| 最近记录: |