1

次のC#をF#に変換しようとしています。

    public class Matrix
    {
       double[,] matrix;

public int Cols
        {
            get
            {
                return this.matrix.GetUpperBound(1) + 1;
            }
        }

public int Rows
        {
            get
            {
                return this.matrix.GetUpperBound(0) + 1;
            }
        }

       public Matrix(double[,] sourceMatrix)
       {
        this.matrix = new double[sourceMatrix.GetUpperBound(0) + 1, sourceMatrix.GetUpperBound(1) + 1];
        for (int r = 0; r < this.Rows; r++)
        {
            for (int c = 0; c < this.Cols; c++)
            {
                this[r, c] = sourceMatrix[r, c];
            }
        }
       }

       public double this[int row, int col]
       {
         get
         {
             return this.matrix[row, col];
         }
         set
         {
             this.matrix[row, col] = value;
         }
       }
     }

これは私がこれまでに持っているものです:

type Matrix(sourceMatrix:double[,]) =
let mutable (matrix:double[,]) = Array2D.create (sourceMatrix.GetUpperBound(0) + 1) (sourceMatrix.GetUpperBound(1) + 1) 0.0
member this.Item
    with get(x, y) = matrix.[(x, y)]
    and set(x, y) value = matrix.[(x, y)] <- value
do
    for i = 0 to matrix.[i].Length - 1 do
    for j = (i + 1) to matrix.[j].Length - 1 do
        this.[i].[j] = matrix.[i].[j]

上記の私のタイプには2つの問題があるようです。解決方法がわかりません。1つ目は、そのmatrix。[(x、y)]のタイプは `a []であると予想されますが、タイプはdouble [、]です。2つ目は、型定義には、メンバー定義とインターフェース定義の前にlet/doバインディングが必要です。それに関する問題は、doブロックにインデックス付きプロパティを設定しようとしていることです。つまり、最初にそれを作成する必要があります。

前もって感謝します、

ボブ

4

2 に答える 2

6

最初の問題に関しては、matrix.[x,y]代わりに使用する必要がありmatrix.[(x,y)]ます。行列は、整数のタプルではなく、2つの整数でインデックス付けされます(ただし、これらは概念的には似ています)。

これは、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したがって、行列のエントリは変更される可能性がありますが、サイズは変更されないため、コンストラクタで行と列の数を1回計算できます。

ただし、コードをより直訳したい場合は、新しく構築したインスタンスに名前を付けることができます(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
于 2011-03-05T21:44:56.693 に答える
2
type Matrix(sourceMatrix:double[,]) =
    let matrix = Array2D.copy sourceMatrix
    member this.Item
        with get(x, y) = matrix.[x, y]
        and set(x, y) value = matrix.[x, y] <- value
于 2011-03-05T21:45:37.397 に答える