Towel: 行列のカスタムクラス?

作成日 2020年07月08日  ·  4コメント  ·  ソース: ZacharyPatten/Towel

行列にユーザー定義クラスを使用できることは知っていますが、それを理解することはできません。 フロートを実装したいとしましょう。

public class MyFloat
{
    private float value;
    public MyFloat(float value)
    {
        this.value = value;
    }

    public static MyFloat operator *(MyFloat a, MyFloat b) => new MyFloat(a.value * b.value);
    public static MyFloat operator +(MyFloat a, MyFloat b) => new MyFloat(a.value + b.value);
    public static MyFloat operator /(MyFloat a, MyFloat b) => new MyFloat(a.value / b.value);
    public static MyFloat operator -(MyFloat a, MyFloat b) => new MyFloat(a.value - b.value);
    public static MyFloat Zero => new MyFloat(0);
    public static implicit operator MyFloat(float a) => new MyFloat(a);
    public static implicit operator float(MyFloat a) => a.value;
    public static implicit operator MyFloat(int a) => new MyFloat(a); // this one is needed for Constant<T>.Zero
}

次に、2つの行列を作成し、それらを乗算してみます

var a = new Matrix<MyFloat>(3, 5);
for (int i = 0; i < a.Rows; i++)
    for (int j = 0; j < a.Columns; j++)
        a[i, j] = 3;

var b = new Matrix<MyFloat>(5, 6);
for (int i = 0; i < b.Rows; i++)
    for (int j = 0; j < b.Columns; j++)
        b[i, j] = 5;

var c = a  * b;
Console.WriteLine(c);

そして、それはハングします。 何かが足りないと思いますが、ドキュメントやサンプルで見つけることができませんでしたが、どうすればそれを機能させることができますか?

Bug

最も参考になるコメント

返事が遅くなってごめん。 コードに問題があるようです。 これは実際にはMatrixコードにはなく、 Constant<T>クラスにアクセスしたときに現在実行されているComputePiメソッドにあります。 これはおそらく簡単な修正であり、明日までに修正の準備ができているでしょう。 :)

私がする必要があるのは、 ComputePiメソッドで発生する無限ループを修正するか、すべての定数がConstant<T>クラスで計算されないようにする必要があります。 Constant<T>.Zeroにアクセスしていますが、そのクラスのすべてのメンバーが静的フィールドであるため、現在Constant<T>.Piも計算しています。 私はもともとパフォーマンス上の理由でこれを行いました。

問題を提出していただきありがとうございます。 この問題が修正されたら、もう一度投稿します。 :)

全てのコメント4件

返事が遅くなってごめん。 コードに問題があるようです。 これは実際にはMatrixコードにはなく、 Constant<T>クラスにアクセスしたときに現在実行されているComputePiメソッドにあります。 これはおそらく簡単な修正であり、明日までに修正の準備ができているでしょう。 :)

私がする必要があるのは、 ComputePiメソッドで発生する無限ループを修正するか、すべての定数がConstant<T>クラスで計算されないようにする必要があります。 Constant<T>.Zeroにアクセスしていますが、そのクラスのすべてのメンバーが静的フィールドであるため、現在Constant<T>.Piも計算しています。 私はもともとパフォーマンス上の理由でこれを行いました。

問題を提出していただきありがとうございます。 この問題が修正されたら、もう一度投稿します。 :)

私はこの問題を修正しましたが、現在、サンプルにあるオペレーターよりも数人多くのオペレーターが必要です。 すべての試験方法Towelプロジェクトは、内部にあるTools/Towel_Testingプロジェクト。 ここにサンプルのテストメソッドを追加しました。
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737

次の演算子を追加したことがわかります。

public static bool operator <=(MyFloat a, MyFloat b) => a.value <= b.value;
public static bool operator >=(MyFloat a, MyFloat b) => a.value >= b.value;
public static bool operator ==(MyFloat a, MyFloat b) => a.value == b.value;
public static bool operator !=(MyFloat a, MyFloat b) => a.value != b.value;
public static MyFloat operator -(MyFloat a) => new MyFloat(-a.value);

ComputePiメソッドについては...変数を++するのを忘れました...それをキャッチしてくれてありがとう。 まだ改善の余地はありますが、少なくとも問題は解決しました。 :)ここに私が++を忘れた行がありました: https

この投稿の時点ではnugetパッケージを更新していませんが、近い将来更新する予定です。

今すぐ機能させるための修正プログラムはありますか? たぶん私は別のメソッドや演算子を追加する必要がありますか?

この問題はPR#54で修正されたと思います。 それでも問題が解決しない場合は、この問題を再度開くか、新しい問題を開いてください。

このページは役に立ちましたか?
0 / 5 - 0 評価