2015-12-21 3 views
1
type dMatrix with 
    member t.Item 
     with get(a: int, b: int) = t.dArray.[b+a*t.num_cols |> SizeT] 
     and set(a: int, b: int) (value: floatType) = t.dArray.[b+a*t.num_cols |> SizeT] <- value 
    member t.setItem(a: int, b: int) (value: floatType) = t.dArray.[b+a*t.num_cols |> SizeT] <- value 

let a = dMatrix.createRandomUniformMatrix n m 50.f 50.0f 

a.[1,1] <- 654.0f // Gives 'A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...'' 
a.setItem(1,1) 654.0f // Works fine. 

Je ne suis pas sûr de ce qui se passe dans ce qui précède. dArray est de type CudaDeviceVariable<float32> depuis la bibliothèque ManagedCuda si cela peut vous aider.Pourquoi l'ensemble d'éléments ne fonctionne-t-il pas comme prévu?

Edit:

type dMatrix = 
    struct 
     val num_rows:int 
     val num_cols:int 
     val dArray: CudaDeviceVariable<floatType> 

Voici comment l'struct ci-dessus ressemble. Même si je rend dArray mutable, cela ne fonctionne toujours pas, mais écrit quelque chose comme a.dArray.[SizeT 0] <- 2.5f fait. Y at-il une solution de contournement pour cela? Edit2: Transformer ce qui précède en un enregistrement ou une classe résout le problème.

Répondre

2

Le message d'erreur est très utile ici. En F #, les valeurs sont immuables par défaut. Mutabilité doit être déclarée voir explicitement: https://msdn.microsoft.com/en-us/library/dd233185.aspx

Si vous voulez faire a mutable, faire:

let mutable a = dMatrix.createRandomUniformMatrix n m 50.f 50.0f 

Il est normalement pas nécessaire de faire quelque chose mutable à moins que vous souhaitez modifier la valeur elle-même (par opposition à muter un des membres de cet objet), ce comportement est différent entre valeur et types référence, par exemple ce compilera:

let a = [|5; 10; 9; 3; 2|] 
a.[2] <- 6 

Mais si étaient a struct avec un indexeur, ce ne serait pas. Par exemple, cette structure produit exactement le même comportement que vous décrivez:

type TestStruct = 
    struct 
     val mutable Xs : int[] 
    end 

    member this.Item 
     with get(i) = this.Xs.[i] 
     and set(i : int) (value) = this.Xs.[i] <- value 

    member this.SetValue i y = 
     this.Xs.[i] <- y 

Donc, je suppose que vous avez des types de valeur impliqués.

+0

Voir les modifications ci-dessus. Aussi, avant que j'écrive l'édition, j'ai supposé que faire le mutable ferait fonctionner l'exemple, mais ce n'est pas le cas. Je vais essayer avec un cours et un disque. –

+0

@MarkoGrdinic Est-ce que 'dArray' peut aussi être mutable? – TheInnerLight

+0

Non. La dMatrix n'a pas besoin d'être une structure non plus. Je l'ai juste essayé pour des raisons de performance et une fois que j'ai vu qu'il n'y avait pas de différence, je l'ai laissé tel quel. –