首页 > 解决方案 > 创建所有非零元素设置为一的新矩阵(朱莉娅)

问题描述

我想要一种有效的(矢量化)方法将 julia 中的矩阵操作为新矩阵,其中所有非零元素都是新矩阵中的元素。

例如,我想要这个矩阵

0 3 6 8 0
7 0 2 0 1
0 4 9 1 0

成为

0 1 1 1 0
1 0 1 0 1
0 1 1 1 0

标签: matrixjulialinear-algebra

解决方案


最简单的是将这个矩阵转换成这样的矩阵BitMatrix

julia> x = [0 3 6 8 0
            7 0 2 0 1
            0 4 9 1 0]
3×5 Matrix{Int64}:
 0  3  6  8  0
 7  0  2  0  1
 0  4  9  1  0

julia> x .!= 0
3×5 BitMatrix:
 0  1  1  1  0
 1  0  1  0  1
 0  1  1  1  0

如果您希望矩阵包含Int值,那么您可以执行以下操作:

julia> Int.(x .!= 0)
3×5 Matrix{Int64}:
 0  1  1  1  0
 1  0  1  0  1
 0  1  1  1  0

最后,如果您的0值具有混合类型并且您希望“按原样”保留它们,那么您可以这样做:

julia> x = Real[0   3 6 8 UInt8(0)
                7   0 2 0 1
                0.0 4 9 1 0]
3×5 Matrix{Real}:
 0    3  6  8  0x00
 7    0  2  0     1
 0.0  4  9  1     0

julia> @. ifelse(iszero(x), x, 1)
3×5 Matrix{Real}:
 0    1  1  1  0x00
 1    0  1  0     1
 0.0  1  1  1     0

除了广播之外,您还可以使用理解,这也应该很快。例如。

julia> [v == 0 ? v : 1 for v in x]
3×5 Matrix{Real}:
 0    1  1  1  0x00
 1    0  1  0     1
 0.0  1  1  1     0

或者例如

julia> [ifelse(v == 0, 0, 1) for v in x]
3×5 Matrix{Int64}:
 0  1  1  1  0
 1  0  1  0  1
 0  1  1  1  0

推荐阅读