2016-11-14 24 views
2

私は奇妙な動作をしています - ギザギザの配列に単一の値を割り当てると、それは列全体の値を変更します。F#ギザギザの配列の割り当て

let testArray = Array.create 5 (Array.create 5 nan) 
testArray.[3].[3] <- 1.0 

上記のコードは、単一セルの値を変更する代わりに、列全体の値を変更します。 1つのこれで5つのnan sの配列、および他の配列:あなたは(私はあなたが期待すると仮定して)2次元配列を作成していないのではなく、あなたは正確に二つの配列を作成しているので、これが起こる

val it : float [] [] = 
    [|[|nan; nan; nan; 1.0; nan|]; [|nan; nan; nan; 1.0; nan|]; 
    [|nan; nan; nan; 1.0; nan|]; [|nan; nan; nan; 1.0; nan|]; 
    [|nan; nan; nan; 1.0; nan|]|] 
+2

可能な複製( http://stackoverflow.com/questions/34252606/array-create-and-jagged-array) –

答えて

12

その中の最初の配列への5つの参照があります。ただ、問題を説明するために、次のコードは、あなたと完全に同等です:

let firstArray = Array.create 5 nan 
let testArray = Array.create 5 firstArray 
testArray.[3].[3] <- 1.0 

ラインtestArray.[3].[3] <- 1.0は、実際には一つの要素変化するように - firstArrayで4分の1をしますが、その後、testArrayを印刷しようとした場合、そのfirstArrayへの複数の参照があるため、同じ要素が複数回表示されます。代わりに、要素の「次の要素を作成」機能を取る

あなたはそれに5つの異なる配列を持つ配列を作成したい場合は、Array.initを使用する必要がある、:

let testArray = Array.init 5 (fun _ -> Array.create 5 nan) 

また、あなたが使用することができますリストを作成して配列を作成してください:

let testArray = [|for i in 1..5 -> Array.create 5 nan|] 

両方とも同じ結果が得られますが、最初の方がパフォーマンスが少し向上します。あなたが本当に2次元アレイ(というよりも配列の配列)で作業する必要がある場合

、あなたの代わりにArray2Dで見たいと思うかもしれません:

let testArray = Array2D.create 5 5 nan 
testArray.[3,3] <- 1.0 
[Array.createとジャグ配列]の