行列にユーザー定義クラスを使用できることは知っていますが、それを理解することはできません。 フロートを実装したいとしましょう。
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);
そして、それはハングします。 何かが足りないと思いますが、ドキュメントやサンプルで見つけることができませんでしたが、どうすればそれを機能させることができますか?
返事が遅くなってごめん。 コードに問題があるようです。 これは実際には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で修正されたと思います。 それでも問題が解決しない場合は、この問題を再度開くか、新しい問題を開いてください。
最も参考になるコメント
返事が遅くなってごめん。 コードに問題があるようです。 これは実際にはMatrixコードにはなく、
Constant<T>
クラスにアクセスしたときに現在実行されているComputePi
メソッドにあります。 これはおそらく簡単な修正であり、明日までに修正の準備ができているでしょう。 :)私がする必要があるのは、
ComputePi
メソッドで発生する無限ループを修正するか、すべての定数がConstant<T>
クラスで計算されないようにする必要があります。Constant<T>.Zero
にアクセスしていますが、そのクラスのすべてのメンバーが静的フィールドであるため、現在Constant<T>.Pi
も計算しています。 私はもともとパフォーマンス上の理由でこれを行いました。問題を提出していただきありがとうございます。 この問題が修正されたら、もう一度投稿します。 :)