Julia 中的单位矩阵
Identity matrix in Julia
我正在尝试在 Julia 1.1
中构建单位矩阵。查看 documentation 后,我发现我可以按如下方式计算 4x4 单位矩阵:
julia> Id4 =1* Matrix(I, 4, 4)
4×4 Array{Int64,2}:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
这是最简单的编码方式还是有 better/shorter 方式,因为它是常用的矩阵?
给定 using LinearAlgebra
,表示单位矩阵的最 julianic 方式是:
I
这个回答看似老生常谈,但也颇有深意。运算符 I
的全部要点在于,在用户需要单位矩阵的绝大多数情况下,没有必要实际实例化该矩阵。
假设您想要一个 1000x1000
单位矩阵。为什么浪费时间构建整个矩阵,当您可以只使用 I
时,请注意 sizeof(I)
的计算结果为 1
(即对象的大小为 1 个字节)。基础 Julia 中的所有函数(包括 LinearAlgebra
)都理解 I
是什么,并且可以适当地使用它,而不必浪费时间首先构建它所代表的实际矩阵。
现在,出于某种原因,您可能需要指定单位矩阵元素的类型。注:
julia> I
UniformScaling{Bool}
true*I
所以在这种情况下,您使用的是概念单位矩阵,其对角线为 true
,非对角线为 false
。在许多情况下这就足够了,即使您的其他矩阵是 Int
或 Float64
。在内部,Julia 将使用专门针对类型的方法。但是,如果要指定单位矩阵包含整数或浮点数,请使用:
julia> 1I
UniformScaling{Int64}
1*I
julia> 1.0I
UniformScaling{Float64}
1.0*I
请注意 sizeof(1I)
的计算结果为 8
,表示该矩阵成员的名义 Int64
类型。
另请注意,您可以使用例如5I
如果你想要一个对角线为 5
而其他地方为 0
的概念矩阵。
在某些情况下(这些情况比许多人想象的要少得多),您可能需要实际构建矩阵。在这种情况下,您可以使用例如:
Matrix(1I, 3, 3) # Identity matrix of Int type
Matrix(1.0I, 3, 3) # Identity matrix of Float64 type
Matrix(I, 3, 3) # Identity matrix of Bool type
Bogumił 在评论中还指出,如果您对在上述构造函数的第一个参数中暗示输出类型感到不舒服,您也可以使用(稍微冗长一点):
Matrix{Int}(I, 3, 3) # Identity matrix of Int type
Matrix{Float64}(I, 3, 3) # Identity matrix of Float64 type
Matrix{Bool}(I, 3, 3) # Identity matrix of Bool type
并明确指定类型。
但实际上,您可能需要这样做的唯一次数如下:
- 当您想要将单位矩阵输入到包中的函数时,以输入必须是具体矩阵类型的方式编写。
- 当您想从单位矩阵开始,然后通过一个或多个转换将其原地变异为其他矩阵时。
我正在尝试在 Julia 1.1
中构建单位矩阵。查看 documentation 后,我发现我可以按如下方式计算 4x4 单位矩阵:
julia> Id4 =1* Matrix(I, 4, 4)
4×4 Array{Int64,2}:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
这是最简单的编码方式还是有 better/shorter 方式,因为它是常用的矩阵?
给定 using LinearAlgebra
,表示单位矩阵的最 julianic 方式是:
I
这个回答看似老生常谈,但也颇有深意。运算符 I
的全部要点在于,在用户需要单位矩阵的绝大多数情况下,没有必要实际实例化该矩阵。
假设您想要一个 1000x1000
单位矩阵。为什么浪费时间构建整个矩阵,当您可以只使用 I
时,请注意 sizeof(I)
的计算结果为 1
(即对象的大小为 1 个字节)。基础 Julia 中的所有函数(包括 LinearAlgebra
)都理解 I
是什么,并且可以适当地使用它,而不必浪费时间首先构建它所代表的实际矩阵。
现在,出于某种原因,您可能需要指定单位矩阵元素的类型。注:
julia> I
UniformScaling{Bool}
true*I
所以在这种情况下,您使用的是概念单位矩阵,其对角线为 true
,非对角线为 false
。在许多情况下这就足够了,即使您的其他矩阵是 Int
或 Float64
。在内部,Julia 将使用专门针对类型的方法。但是,如果要指定单位矩阵包含整数或浮点数,请使用:
julia> 1I
UniformScaling{Int64}
1*I
julia> 1.0I
UniformScaling{Float64}
1.0*I
请注意 sizeof(1I)
的计算结果为 8
,表示该矩阵成员的名义 Int64
类型。
另请注意,您可以使用例如5I
如果你想要一个对角线为 5
而其他地方为 0
的概念矩阵。
在某些情况下(这些情况比许多人想象的要少得多),您可能需要实际构建矩阵。在这种情况下,您可以使用例如:
Matrix(1I, 3, 3) # Identity matrix of Int type
Matrix(1.0I, 3, 3) # Identity matrix of Float64 type
Matrix(I, 3, 3) # Identity matrix of Bool type
Bogumił 在评论中还指出,如果您对在上述构造函数的第一个参数中暗示输出类型感到不舒服,您也可以使用(稍微冗长一点):
Matrix{Int}(I, 3, 3) # Identity matrix of Int type
Matrix{Float64}(I, 3, 3) # Identity matrix of Float64 type
Matrix{Bool}(I, 3, 3) # Identity matrix of Bool type
并明确指定类型。
但实际上,您可能需要这样做的唯一次数如下:
- 当您想要将单位矩阵输入到包中的函数时,以输入必须是具体矩阵类型的方式编写。
- 当您想从单位矩阵开始,然后通过一个或多个转换将其原地变异为其他矩阵时。