首页 > 解决方案 > 如何从包含 Julia 范围的向量中获取值

问题描述

来自R我习惯于做这样的事情来获取 vector 的第一个元素a

a <- c(1:3, 5)
a[1]
[1] 1

H 我可以1进去Julia吗?的第一个元素a现在是 a range

a = [1:3, 5]
a[1]
1-element Array{UnitRange{Int64},1}:
 1:3

标签: vectorjulia

解决方案


这里的核心问题是c(1:3, 5)在 R 和[1:3, 5]Julia 中不做同样的事情。R 代码将一个向量与一个整数连接起来,产生一个由四个整数组成的向量:

> c(1:3, 5)
[1] 1 2 3 5

Julia 代码构造了一个二元素向量,其元素是范围1:3和整数5

julia> [1:3, 5]
2-element Vector{Any}:
  1:3
 5

julia> map(typeof, ans)
2-element Vector{DataType}:
 UnitRange{Int64}
 Int64

该向量具有元素类型Any,因为没有更小的有用的通用超类型范围和整数。如果你想连接1:35一起形成一个向量,你可以;在括号内使用,而不是,

julia> a = [1:3; 5]
4-element Vector{Int64}:
 1
 2
 3
 5

正确定义a后,您可以像在 R 中一样获取它的第一个元素a[1]。通常在 Julia 中的方括号内:

  • 逗号 ( ,) 仅用于构造给定元素的向量,就像在 Python、Ruby、Perl 或 JavaScript 中一样。

  • 如果您想要像 R 或 Matlab 中的块连接,那么您需要使用分号/换行符(;\n)进行垂直连接,使用空格进行水平连接。

给定的示例[1:3; 5]是块连接的一个非常简单的实例,但可能还有更复杂的实例。这是构造块矩阵的一个奇特示例:

julia> using LinearAlgebra

julia> A = rand(2, 3)
2×3 Matrix{Float64}:
 0.895017  0.442896  0.0488714
 0.750572  0.797464  0.765322

julia> [A' I
        0I A]
5×5 Matrix{Float64}:
 0.895017   0.750572  1.0       0.0       0.0
 0.442896   0.797464  0.0       1.0       0.0
 0.0488714  0.765322  0.0       0.0       1.0
 0.0        0.0       0.895017  0.442896  0.0488714
 0.0        0.0       0.750572  0.797464  0.765322

为 StackOverflow 在这里突出显示的糟糕语法道歉:它似乎被 postfix 混淆了',将其解释为一个永无止境的字符文字。稍微解释一下这个例子:

  • A是一个 2×3 的随机Float64元素矩阵
  • A'是的伴随(共轭转置)A
  • I是可变大小单位对角运算符
  • 0I相似但对角线标量为零

它们连接在一起形成一个 5×5 的Float64元素矩阵,其中左上和右下部分分别从A'和填充A,而左下角用零填充,左上角用 3×3 单位矩阵填充(即对角线的零)。


推荐阅读