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.

我不确定上面发生了什么。如果有帮助,则属于ManagedCudadArray中的类型。CudaDeviceVariable<float32>

编辑:

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

这是上面的结构的外观。即使我使 dArray 可变,它仍然不起作用,但编写类似的东西a.dArray.[SizeT 0] <- 2.5f。有什么解决方法吗?

Edit2:将上述内容转换为记录或类可以解决问题。

4

1 回答 1

2

错误消息在这里很有帮助。在 F# 中,默认情况下值是不可变的。必须明确声明可变性,请参阅:https ://msdn.microsoft.com/en-us/library/dd233185.aspx

如果要使a可变,请执行以下操作:

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

除非您希望更改值本身(而不是改变该对象的成员之一),否则通常不需要进行某些mutable操作,这种行为在值和引用类型之间是不同的,例如这将编译:

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

但是,如果 a 是a带有索引器的结构,则不会。例如,此结构产生与您描述的完全相同的行为:

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

所以,我猜你涉及到值类型。

于 2015-12-21T10:09:58.363 回答