Towel: Classes personnalisées pour les matrices ?

Créé le 8 juil. 2020  ·  4Commentaires  ·  Source: ZacharyPatten/Towel

Je sais que vous pouvez utiliser des classes définies par l'utilisateur pour les matrices, mais je ne peux pas les parcourir. Disons que je veux implémenter mon float :

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
}

Ensuite, je crée deux matrices et essaie de les multiplier

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

Et puis ça accroche. Je pense qu'il me manque quelque chose, mais je ne l'ai pas trouvé dans les documents ou les exemples, mais comment puis-je le faire fonctionner ?

Bug

Commentaire le plus utile

Désolé pour la réponse tardive. Il semble y avoir un problème dans mon code. En fait, ce n'est pas dans le code Matrix, c'est dans ma méthode ComputePi qui s'exécute actuellement lorsque j'accède à la classe Constant<T> . Ce sera probablement une solution facile, et j'aurai probablement la solution prête d'ici demain. :)

Ce que je dois faire, c'est soit corriger la boucle infinie qui se produit dans la méthode ComputePi , soit empêcher que toutes les constantes soient calculées dans la classe Constant<T> . Même si j'accède à Constant<T>.Zero , il calcule également actuellement Constant<T>.Pi puisque tous les membres de cette classe sont des champs statiques. Je l'ai fait à l'origine pour des raisons de performances.

Merci d'avoir soumis le problème. Je posterai à nouveau sur ce problème lorsqu'il sera résolu. :)

Tous les 4 commentaires

Désolé pour la réponse tardive. Il semble y avoir un problème dans mon code. En fait, ce n'est pas dans le code Matrix, c'est dans ma méthode ComputePi qui s'exécute actuellement lorsque j'accède à la classe Constant<T> . Ce sera probablement une solution facile, et j'aurai probablement la solution prête d'ici demain. :)

Ce que je dois faire, c'est soit corriger la boucle infinie qui se produit dans la méthode ComputePi , soit empêcher que toutes les constantes soient calculées dans la classe Constant<T> . Même si j'accède à Constant<T>.Zero , il calcule également actuellement Constant<T>.Pi puisque tous les membres de cette classe sont des champs statiques. Je l'ai fait à l'origine pour des raisons de performances.

Merci d'avoir soumis le problème. Je posterai à nouveau sur ce problème lorsqu'il sera résolu. :)

J'ai résolu le problème, bien que j'aie actuellement besoin de quelques opérateurs de plus que ceux que vous aviez dans votre échantillon. Toutes les méthodes de test pour le projet Towel sont à l'intérieur du projet Tools/Towel_Testing . J'ai ajouté une méthode de test pour votre échantillon ici :
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737

Vous pouvez voir que j'ai ajouté les opérateurs suivants :

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

Quant à la méthode ComputePi ... j'ai oublié de ++ une variable... alors merci d'avoir attrapé ça. Il y a encore de la place pour l'amélioration, mais cela a au moins résolu votre problème. :) Voici la ligne sur laquelle j'ai oublié le ++ : https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

Je n'ai pas mis à jour le paquet nuget à partir de ce post, mais je le ferai dans un proche avenir.

Existe-t-il un correctif pour que je puisse le faire fonctionner maintenant? Peut-être devrais-je ajouter une autre méthode ou un autre opérateur ?

Je crois que ce problème a été résolu dans PR #54. S'il y a toujours un problème ou d'autres problèmes, veuillez rouvrir ce problème ou ouvrir un nouveau problème.

Cette page vous a été utile?
0 / 5 - 0 notes