2017-01-10 14 views
0

スカラを初めて使いました。配列を繰り返して行列に値を代入するのに問題があります。私のプログラミングの背景は主にPythonなので、私はこの作業を行うための機能的な方法を見ていません。Scalaの配列の次の項目として各値を代入する

私は配列val averages = Array(1,2,3,4,5,6,7,8,9)を持っています。私はScalaライブラリbreezeで作られた空の3x3行列Mを持っています。私は配列から値を取り出して行列に入れる必要があります。これは動作しません、とマトリックスの結果は単に「1」で埋め

var index = 0 
for(i <- 0 until M.cols) 
     for(j <- 0 until M.rows) 
      M(i,j) = averages(index) 
      index += 1 

通常、私のような何かをしようとするだろう。 Scalaがになる前にM(i,j) = averages(index)を評価しているため、これが前提です。私は、平均値のためforループの異なる種類を試してきましたが、非常に私が望む結果を得ることができない:私はScalaでランダムコレクションをあなたがこれを行うことができることを知って

1 2 3 
4 5 6 
7 8 9 

を、とで行列を埋めます確率変数:

val r = new scala.util.Random(0) 
for(i <- 0 until M.rows) 
    for(j <- 0 until M.cols) 
     M(i, j) = r.nextDouble() 

しかし、Scalaのドキュメントを見て、Array.nextメソッドを持っていません。

でも、.nextを使用しても、非常に反復的であり、機能的な解決策ではありません。誰でも私を助けることができます1)averagesを介してループする適切な方法を把握し、そして/または2)これを行うための機能的な方法を理解する?ありがとう!

+1

'val averages = Array(1,2,3,4,5,6,7,8,9).toIterator'これは' next'を持っています。 – jwvh

+2

最初のfor-loopで実行したい両方のステートメントの周りに中括弧(ブロックを作る)が必要です。 ScalaはScopingのためにPythonのようなインデントではなく{}を使用します –

+0

あなたは 'Matrix.create(3、3、array)'のように必要なメソッドが既に存在するかもしれません。 –

答えて

2

大括弧で囲まれているだけではないのですか?

var index = 0 
for(i <- 0 until M.cols) 
    for(j <- 0 until M.rows) { 
     M(i,j) = averages(index) 
     index += 1 
    } 

あなたがそれらの中括弧が含まれていない場合は、2番目のforループの最初の行のみが実行されます:それはあるべきようにあなたは、上記のコードが見えます。 Java/Scalaはこれらのカッコを使用してグループ化します。あなたはPythonのようなインデントに頼ることはできません。あなたはインデックスパラメータを使用しない 場合は、いくつかの数学はあまりにも動作します:

for(i <- 0 until M.cols 
    for(j <- 0 until M.rows) { 
     M(i, j) = 1 + i + j * M.cols 
2

データのコピーを別の既存のコレクションから、定義により、副作用に頼ることは、あなたの目標を達成することです。より多くのFPアプローチは古いものから直接新しいものを構築することです。

私はBreezeをインストールしていませんが、scaladocsによれば、このようなことが可能です。

Matrix((0 until colLen).map(x => averages.slice(x*rowLen, (x+1)*rowLen)))