朱莉娅的身份矩阵

时间:2019-07-30 11:09:48

标签: julia linear-algebra

我正在尝试在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

这是对它进行编码的最简洁的方法,还是因为它是经常使用的矩阵而有更好/更短的方法?

1 个答案:

答案 0 :(得分:11)

表达身份矩阵的最简单的方法是:

I

这个答案似乎有些古板,但也很深刻。运算符I的要点在于,在绝大多数情况下,用户想要一个单位矩阵,实际上不必实例化该矩阵

假设您要一个1000x1000身份矩阵。当您只需要使用I时,为什么要浪费时间来构建整个矩阵,请注意sizeof(I)的计算结果为1(即对象的大小为1个字节)。 Julia的所有函数(包括LinearAlgebra)都了解I是什么,并且可以适当地使用它,而不必浪费时间来构建它首先代表的实际矩阵。

现在,由于某些原因,您可能需要指定身份矩阵元素的类型。注意:

julia> I
UniformScaling{Bool}
true*I

因此,在这种情况下,您正在使用对角线为true和非对角线为false的概念身份矩阵。即使您的其他矩阵是IntFloat64,在很多情况下也足够了。在内部,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

Bogumil在评论中还指出,如果您不满意在上面的构造函数的第一个参数中暗示输出的类型,则还可以使用(稍微冗长一些):

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

并明确指定类型。

但是,实际上,您可能唯一需要这样做的次数如下:

  • 当您要将身份矩阵输入到程序包中的函数中时,必须以一种具体的矩阵类型来输入
  • 当您想从一个单位矩阵开始,然后通过一次或多次转换将其适当地突变为其他东西时