ベクトル値関数phi
をベクトルx
に適用したいとします。
phi(x, d) = [x.^i for i=0:d] # vector-valued function
x = Rand(7) # vector
y = phi(x, 3) # should be matrix, but isn't
これで、y
は行列になるはずですが、それは4-element Array{Array{Float64,1},1}
、つまり配列の配列。実際、私はy
を行列にしたいと思っています。 phi
の実装は間違っていますか?または、どうすれば変換できますか?
ありがとう!
すでに述べたように、hcat(x...)
を使用して配列x
の配列を連結できますが、通常は、代わりに最初に行列を作成することをお勧めします。この場合、それを行うことができる2つの方法:
ブロードキャストの使用:
phi(x, d) = x.^((0:d)')
x
がベクトルである限り、行行列(0:d)'
に対してブロードキャストします。
範囲0:d
の代わりにx
を転置することで、転置結果を取得できます。
2次元配列内包表記の使用:
phi(x, d) = [xi.^di for xi in x, di in 0:d]
これは、x
が反復可能である限り機能します。 x
がn-d配列の場合、最初にフラット化されたかのように解釈されます。
理解変数の順序を切り替えることで、結果を転置できます。
phi(x, d) = [xi.^di for di in 0:d, xi in x]
phi
の出力を行列に変換するには、次のようにします。
y = hcat(phi(x, 3)...)
または、ベクトルを行にしたい場合は、転置が必要です。
y = vcat([x' for x in phi(x, 3)]...)
または、次のように定義することで、phi
内の行列に変換できます。
phi(x, d) = hcat([x.^i for i=0:d]...)
より一般的には、スプラット演算子...
をhcat
とともに使用することもできます。
X = [[1,2], [3, 4], [5,6]]
hcat(X...)
2行3列の行列を与える
1 3 5
2 4 6
hcat(X...)
のようなスプラッティングの代わりに、reduce
を使用することもできます。
reduce(hcat, X)
だから、あなたの場合、これはトリックを行います
reduce(hcat, phi(x, 3))