Что касается вашей первой проблемы, вы хотите использовать matrix.[x,y]
вместо matrix.[(x,y)]
- ваша матрица индексируется двумя целыми числами, а не кортежем целых (хотя они концептуально схожи).
Вотчто-то примерно эквивалентное вашему C #:
type Matrix(sourceMatrix:double[,]) =
let rows = sourceMatrix.GetUpperBound(0) + 1
let cols = sourceMatrix.GetUpperBound(1) + 1
let matrix = Array2D.zeroCreate<double> rows cols
do
for i in 0 .. rows - 1 do
for j in 0 .. cols - 1 do
matrix.[i,j] <- sourceMatrix.[i,j]
member this.Rows = rows
member this.Cols = cols
member this.Item
with get(x, y) = matrix.[x, y]
and set(x, y) value = matrix.[x, y] <- value
Это предполагает, что ваша матрица не может быть переназначена (например, в опубликованном вами C # вы могли бы сделать ваше поле matrix
readonly
-если нет дополнительного кода, который вы скрыли).Поэтому число строк и столбцов можно вычислить один раз в конструкторе, поскольку элементы матрицы могут измениться, но ее размер не изменится.
Однако, если вы хотите более буквальный перевод вашего кода, выможет дать вашему вновь созданному экземпляру имя (в данном случае this
):
type Matrix(sourceMatrix:double[,]) as this =
let mutable matrix = Array2D.zeroCreate<double> (sourceMatrix.GetUpperBound(0) + 1) (sourceMatrix.GetUpperBound(1) + 1)
do
for i in 0 .. this.Rows - 1 do
for j in 0 .. this.Cols - 1 do
this.[i,j] <- sourceMatrix.[i,j]
member this.Rows = matrix.GetUpperBound(0) + 1
member this.Cols = matrix.GetUpperBound(1) + 1
member this.Item
with get(x, y) = matrix.[x, y]
and set(x, y) value = matrix.[x, y] <- value