Towel: Benutzerdefinierte Klassen für Matrizen?

Erstellt am 8. Juli 2020  ·  4Kommentare  ·  Quelle: ZacharyPatten/Towel

Ich weiß, dass Sie benutzerdefinierte Klassen für Matrizen verwenden können, aber ich kann es nicht durchgehen. Nehmen wir an, ich möchte meinen Float implementieren:

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
}

Dann erstelle ich zwei Matrizen und versuche sie zu multiplizieren

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);

Und dann hängt es. Ich glaube, ich vermisse etwas, konnte es aber nicht in Dokumenten oder Beispielen finden, aber wie kann ich es zum Laufen bringen?

Bug

Hilfreichster Kommentar

Entschuldigung für die späte Antwort. Es scheint ein Problem in meinem Code zu geben. Es befindet sich tatsächlich nicht im Matrix-Code, sondern in meiner Methode ComputePi , die derzeit ausgeführt wird, wenn ich auf die Klasse Constant<T> zugreife. Dies wird wahrscheinlich eine einfache Lösung sein, und ich werde die Lösung wahrscheinlich bis morgen fertig haben. :)

Was ich tun muss, ist entweder die Endlosschleife zu reparieren, die in der ComputePi Methode passiert, oder ich muss verhindern, dass alle Konstanten in der Constant<T> Klasse berechnet werden. Obwohl ich auf Constant<T>.Zero zugreife, berechnet es derzeit auch Constant<T>.Pi da alle Mitglieder dieser Klasse statische Felder sind. Ich habe dies ursprünglich aus Leistungsgründen gemacht.

Vielen Dank für die Übermittlung des Problems. Ich werde zu diesem Problem noch einmal posten, wenn es behoben ist. :)

Alle 4 Kommentare

Entschuldigung für die späte Antwort. Es scheint ein Problem in meinem Code zu geben. Es befindet sich tatsächlich nicht im Matrix-Code, sondern in meiner Methode ComputePi , die derzeit ausgeführt wird, wenn ich auf die Klasse Constant<T> zugreife. Dies wird wahrscheinlich eine einfache Lösung sein, und ich werde die Lösung wahrscheinlich bis morgen fertig haben. :)

Was ich tun muss, ist entweder die Endlosschleife zu reparieren, die in der ComputePi Methode passiert, oder ich muss verhindern, dass alle Konstanten in der Constant<T> Klasse berechnet werden. Obwohl ich auf Constant<T>.Zero zugreife, berechnet es derzeit auch Constant<T>.Pi da alle Mitglieder dieser Klasse statische Felder sind. Ich habe dies ursprünglich aus Leistungsgründen gemacht.

Vielen Dank für die Übermittlung des Problems. Ich werde zu diesem Problem noch einmal posten, wenn es behoben ist. :)

Ich habe das Problem behoben, obwohl ich derzeit ein paar mehr Operatoren benötige als nur die, die Sie in Ihrem Beispiel hatten. Alle Testmethoden für das Projekt Towel befinden sich im Projekt Tools/Towel_Testing . Ich habe hier eine Testmethode für Ihre Probe hinzugefügt:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathetics/Matrix.cs#L1737

Sie sehen, dass ich die folgenden Operatoren hinzugefügt habe:

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);

Was die Methode ComputePi betrifft... ich habe vergessen, ++ eine Variable zu schreiben... also danke, dass du das verstanden hast. Es gibt noch Raum für Verbesserungen, aber das hat zumindest Ihr Problem behoben. :) Hier war die Zeile, in der ich die ++ vergessen habe: https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

Ich habe das Nuget-Paket zum Zeitpunkt dieses Beitrags noch nicht aktualisiert, werde dies jedoch in naher Zukunft tun.

Gibt es einen Hotfix, damit ich es jetzt zum Laufen bringen kann? Vielleicht sollte ich eine andere Methode oder einen anderen Operator hinzufügen?

Ich glaube, dieses Problem wurde in PR #54 behoben. Wenn weiterhin ein Problem oder weitere Probleme bestehen, öffnen Sie dieses Problem erneut oder eröffnen Sie ein neues Problem.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen