【问题标题】:Difference between nx1 array and n-element array in JuliaJulia中nx1数组和n元素数组的区别
【发布时间】:2014-01-16 01:56:54
【问题描述】:

在 Julia 中,如果我定义一个包含 1 列和 n 行的数组,它似乎实例化了一个“n 元素数组”,我不明白这与 nx1 数组有何不同:

julia> a = [1 2 3]
1x3 Array{Int64,2}:
 1  2  3

julia> b = [1;2;3]
3-element Array{Int64,1}:
 1
 2
 3

令人困惑的是,如果我对一个 n 元素数组进行两次转置,则返回结果是一个 nx1 数组:

julia> transpose(transpose(b))
3x1 Array{Int64,2}:
 1
 2
 3

这会导致一些(对我而言)意想不到的行为,例如:

julia> size(b) == size(transpose(transpose(b)))
false

我的问题:

  1. nx1 数组和 n 元素数组有什么区别?
  2. 如何创建nx1 数组而不执行我给出的双转置示例。

【问题讨论】:

    标签: julia


    【解决方案1】:

    快速回答:

    1. nx1 或 1xn 数组是二维矩阵(恰好只有一行或一列),而您的 n 元素数组是一维列向量。李>
    2. 我认为创建nx1 数组字面量的最简单方法是对行向量进行转置:[1 2 3]'。反过来,您可以使用 vec 将任何 n 维数组展平为一维向量。

    不过,思考为什么这很重要会更有启发意义。 Julia 的类型系统被设计为完全基于类型,而不是值。数组的维数包含在其类型信息中,但不包含行数和列数。因此,nx1 矩阵和 n 元素向量之间的区别在于它们具有不同的类型……并且类型推理引擎无法看到矩阵只有一列。

    为了从 Julia 中获得最佳性能,您(尤其是核心语言和库设计者)希望编写类型稳定的函数。也就是说,函数应该能够完全根据参数的类型推断它们将返回什么类型。这允许编译器通过函数跟踪您的变量,而不会丢失类型的跟踪……这反过来又允许它为该特定类型生成高度优化的代码。

    现在,再次考虑转置。如果你想要一个类型稳定的转置函数,它必须至少返回一个二维数组。如果其中一个维度是 1 并且仍然保持良好的性能,它根本无法做一些棘手的事情。

    尽管如此,在邮件列表和 GitHub 问题上仍然有大量关于向量转置的讨论。这是一个开始的好地方:Issue #2686: ones(3) != ones(3)''。或对相关问题进行更深入的讨论:Issue #3262: embed tensor-like objects as higher-dimensional objects with trailing singleton dimensions。两者最终都被取代并转入Issue #4774: Taking vector transposes seriously


    Julia 0.6 更新:Julia 现在非常重视向量转置!向量转置现在返回一个特殊的 RowVector 类型,它的作用类似于 1 行矩阵,但额外知道只有一行。这也是对原始向量的惰性“视图”。对于问题中的示例,这意味着不仅size(b) == size(transpose(transpose(b))) 是真的,而且b'' === b 也是如此。

    在 Julia 0.6 中指定改变维度的重塑操作也更容易一些。上面问题 2(创建 nx1 数组)的一个很好的答案是使用 reshape([1,2,3], :, 1)。计算: 指定的维度以匹配源数组的长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2021-05-24
      • 1970-01-01
      • 2016-12-28
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多