【问题标题】:Julia Array Range AccessJulia 数组范围访问
【发布时间】:2017-10-19 13:00:51
【问题描述】:

创建像 d = [1 2 3 4 5 6 7 8 9] 这样的数组会创建一个维度为 2 的 1x9 数组(附带问题:为什么是二维?)。

这可以用作矩阵和向量乘法中的行向量。 访问d[2:5] 的范围不会返回排列在1x4 数组中的值。结果基本上是一个维度为4x1 的列向量。 (在 Matlab/Octave 中,访问向量范围时会保持维度。)

但是,使用d[:,2:5](而不是d[1,2:5])返回行向量。

这对我来说似乎很奇怪,因为这意味着我必须始终注意行/列向量。 那么这真的是预期用途还是我走错了路? 另外,有人能解释一下为什么d[:,2:5] 有效,而d[1,2:5] 无效吗?

【问题讨论】:

  • “我总是要注意行/列向量”我认为这是预期的行为。 d = [1 2 3 4 5 6 7 8 9] 有两个维度,因为在多个“列”上扩展的所有内容都有第二个维度,即使该行只有一个。
  • 一般不建议仅在一个 SO 帖子中提出多个问题仅供参考。
  • 从技术上讲,您上面提到的“行向量”实际上是1 -row Matrix aka 1x4 Array。在 Julia 中,我们确实有一个 RowVector 类型(例如 d[2:5].' 和我们 take vector transposes seriously: [1,2,3].' * [1,2,3] #=> 14[1 2 3] * [1,2,3] #=> [14] (1-element array)。与那些“草率”的语言不同,您必须认真了解 Julia 中的所有这些; )

标签: julia


【解决方案1】:

编辑:复制@Gnimuc 的评论,因为我认为这很重要。

从技术上讲,你上面提到的“行向量”实际上是 1 -row Matrix 又名 1x4 Array。在 Julia,我们确实有一个 RowVector 类型(例如d[2:5].',我们认真对待向量转置: [1,2,3].' * [1,2,3] #=> 14[1 2 3] * [1,2,3] #=> [14] (1-element array). 不像那些“草率”的语言,你必须 在 Julia 中认真意识到所有这些;)


d = [1 2 3 4 5 6 7 8 9] 

创建一个维度为 2 的 1x9 数组(附带问题:为什么是二维?)。

因为这是创建二维数组的语法?使用d = [1, 2, 3]d = [1; 2; 3] 创建一维数组(或列向量)。


使用 d[:,2:5] 返回行向量(但不使用 d[1,2:5])。

这对我来说似乎很奇怪,因为这意味着我必须始终注意 行/列向量。那么这真的是预期用途还是我在 错误的路径?另外,有人可以解释为什么 d[:,2:5] 有效,但 d[1,2:5] 没有?

使用 Integer 进行索引会导致维度丢失,而使用 Range(或任何 AbstractVector)进行索引不会删除维度。做出这个决定时有很多讨论,我不会在这里重复,但请看看here 以及其他地方。

就“我始终必须注意行/列向量”而言,这是因为无论您拥有行向量还是列向量都意味着不同的东西,所以自然应该意识到这一点。例如,如果没有区别,则无法区分以下内容:

julia> [1, 2, 3] .* [ 1 2 3 ]
3×3 Array{Int64,2}:
 1  2  3
 2  4  6
 3  6  9

julia> [1, 2, 3] .* [1, 2, 3]
3-element Array{Int64,1}:
 1
 4
 9

希望这对您有所帮助...

【讨论】:

  • 谢谢你和上面的cmets。这(和链接的讨论)确实对我有帮助。我显然期待太多的 octave/matlab 行为:)
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多