在Julia中填充一个带有重复列表的向量

时间:2016-04-17 22:44:38

标签: arrays julia

我想通过重复长度为h次n的较小列向量G来创建列向量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

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

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

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

要么我想使用一些“填充”#39;相当于或某种“扁平化”的函数是否存在,将X的所有元素展平为一个列向量,每个条目都是一个数字。

我也在输出上尝试了重塑功能,但我也无法使用它。

3 个答案:

答案 0 :(得分:4)

正如@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是k元组的k元组。实数。 fill构造后者的对象,而repeat构造前者的对象。

答案 1 :(得分:3)

感谢Dan Getz的回答:

重复([1,2,3,4],外部= [4])应该这样做。 ?在REPL处重复此有用功能。 repmat也可以使用repmat([1,2,3,4],4,1)来做,但返回一个矩阵,而不是一个向量。

答案 2 :(得分:1)

只要你正在使用一维数组(向量)......

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的Vector,它们都是矩阵(Array{Int,2} == Matrix{Int}返回true)。