web-dev-qa-db-ja.com

配列の配列を行列に変換する方法は?

ベクトル値関数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の実装は間違っていますか?または、どうすれば変換できますか?

ありがとう!

17
user2979331

すでに述べたように、hcat(x...)を使用して配列xの配列を連結できますが、通常は、代わりに最初に行列を作成することをお勧めします。この場合、それを行うことができる2つの方法:

  1. ブロードキャストの使用:

    phi(x, d) = x.^((0:d)')
    

    xがベクトルである限り、行行列(0:d)'に対してブロードキャストします。

    範囲0:dの代わりにxを転置することで、転置結果を取得できます。

  2. 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]
    
15

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]...)
13
Dan Getz

より一般的には、スプラット演算子...hcatとともに使用することもできます。

X = [[1,2], [3, 4], [5,6]]
hcat(X...)

2行3列の行列を与える

1  3  5
2  4  6
3
user42988

hcat(X...)のようなスプラッティングの代わりに、reduceを使用することもできます。

reduce(hcat, X)

だから、あなたの場合、これはトリックを行います

reduce(hcat, phi(x, 3))