朱莉娅的身份矩阵

ecj*_*cjb 5 linear-algebra julia

我正在尝试在中构造单位矩阵Julia 1.1。查看文档后,我发现可以如下计算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
Run Code Online (Sandbox Code Playgroud)

这是最常用的编码方式,还是更好/更短的编码方式,因为它是经常使用的矩阵?

Col*_*ers 11

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

I
Run Code Online (Sandbox Code Playgroud)

这个答案看似古怪,但也很深刻。运算符的全部要点I是,在大多数情况下,用户想要一个单位矩阵,就不必实际实例化该矩阵

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

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

julia> I
UniformScaling{Bool}
true*I
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您使用的对角线为true和对角线为非对角线的概念恒等矩阵false。即使在其他矩阵为Int或的情况下,在许多情况下也足够了Float64。在内部,Julia将使用专门针对类型的方法。但是,如果要指定身份矩阵以包含整数或浮点数,请使用:

julia> 1I
UniformScaling{Int64}
1*I

julia> 1.0I
UniformScaling{Float64}
1.0*I
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

并明确指定类型。

但实际上,您可能唯一需要执行此操作的时间如下:

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

  • 或者编写“Matrix{Int}(I, 3, 3)”来给出显式的目标类型说明符。 (2认同)
  • 当您将矩阵用作稍后将发生变异的事物的初始化时,显式构建矩阵也可能很有用。或者,假设您从“M = I”开始,然后像“M *= A”一样用一些矩阵“A”迭代更新。如果“M”被初始化为“I”,那么你会得到类型不稳定。 (2认同)
  • 我是朱莉娅的新手。“I”是内置的吗?当我将其放入解释器中时,我收到“错误:UndefVarError:我未定义”。 (2认同)
  • 显然它已移至线性代数包,因此您需要“使用 LinearAlgebra”。 (2认同)