我想通过重复长度为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的所有元素展平为一个列向量,每个条目都是一个数字。
我也在输出上尝试了重塑功能,但我也无法使用它。
答案 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
)。