【问题标题】:Fill a vector in Julia with a repeated list用重复列表填充 Julia 中的向量
【发布时间】:2016-04-17 22:44:37
【问题描述】:

我想通过将长度为 h 的较小列向量 G 重复 n 次来创建列向量 X。最终向量 X 的长度为 h*n。例如

G = [1;2;3;4] #column vector of length h
X = [1;2;3;4;1;2;3;4;1;2;3;4] #ie X = [G;G;G;G] column vector of
length h*n

我可以在循环中执行此操作,但是否有一个等效于“填充”功能的功能,可以在尺寸不出错的情况下使用。当我尝试在这种情况下使用填充时,我没有得到一个长度为 h*n 的列向量,而是得到一个长度为 n 的列向量,其中每一行都是另一个长度为 h 的向量。例如,我得到以下信息:

X = [[1,2,3,4];[1,2,3,4];[1,2,3,4];[1,2,3,4]]

这对我来说没有意义,因为我知道 ;符号用于显示行中的元素,空格用于显示列中的元素。为什么这里使用 , 符号,它甚至意味着什么?例如,我可以通过 X[1] 访问最终输出 X 的第一行,然后通过 X[1][1] 访问其中的任何元素。

我想使用一些等效的“填充”或某种“展平”功能(如果存在),将 X 的所有元素展平为一个列向量,每个条目都是一个数字。

我也尝试了输出的重塑功能,但我也无法让它工作。

【问题讨论】:

  • repeat([1,2,3,4],outer=[4]) 应该这样做。 ?repeat 在 REPL 中使用这个有用的功能。 repmat 也可以使用 repmat([1,2,3,4],4,1) 来实现,但返回的是矩阵,而不是向量。

标签: arrays julia


【解决方案1】:

感谢 Dan Getz 的回答:

repeat([1, 2, 3, 4], outer = 4)

在 REPL 中输入 ?repeat 以了解这个有用的功能。

在旧版本的 Julia 中,repmat 是一个替代方案,但现在它已成为 deprecated 并被 repeat 吸收

【讨论】:

    【解决方案2】:

    正如@DanGetz 在评论中指出的那样,repeat 是您想要的功能。来自docs

    repeat(A, inner = Int[], outer = Int[])
    

    通过重复A 的条目来构造一个数组。 inner 的第 i 个元素指定 A 的第 i 个维度的各个条目应重复的次数。 outer 的第 i 个元素指定沿 A 的第 i 个维度的切片应重复的次数。

    所以一个做你想做的例子是:

    X = repeat(G; outer=[k])
    

    其中G是要重复的数组,k是重复的次数。


    我还将尝试回答您对fill 结果的困惑。 Julia(像大多数语言一样)区分包含数字的向量和数字本身。我们知道fill(5, 5) 产生[5, 5, 5, 5, 5],这是一个一维数组(一个向量),其中每个元素都是5

    但请注意,fill([5], 5) 会生成一个一维数组(一个向量),其中每个元素都是 [5],它本身就是一个向量。这打印为

    5-element Array{Array{Int64,1},1}:
     [5]
     [5]
     [5]
     [5]
     [5]
    

    我们从类型中看出这确实是一个向量的向量。这当然与向量的串联不同。请注意,[[5]; [5]; [5]; [5]; [5]] 是用于连接的语法,并且会如您所料返回 [5, 5, 5, 5, 5]。但是虽然; 语法(vcat) 可以进行连接,fill 却不能进行连接。

    在数学上(在某些定义下),我们可以想象 R^(kn) 与 (R^k)^n 不同(尽管同构),例如,其中 R^k 是实数。 fill 构造了后者的对象,而repeat 构造了前者的对象。

    【讨论】:

      【解决方案3】:

      只要您使用一维数组(向量)...

      X=repmat(G,4) 应该这样做。

      --

      另一方面,Julia 没有区分行向量和列向量,它们都是一维数组。

      [1,2,3]==[1;2;3] 返回 true,因为它们都是 3-element Array{Int64,1} 或向量(Array{Int,1} == Vector{Int} 返回 true

      这是 Matlab 和 Julia 的区别之一……

      如果您出于某种特定原因想要这样做,您可以创建其中一个维度等于 1 的二维数组(或矩阵)。

      例如:

      C = [1 2 3 4] 将创建一个1x4 Array{Int64,2} 2 那里指示数组的尺寸。

      D = [1 2 3 4]' 将创建一个4x1 Array{Int64,2}

      在这种情况下,C == D 当然会返回false。但是对于 Julia,它们都不是向量,它们都是矩阵(Array{Int,2} == Matrix{Int} 返回 true)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-09-08
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多