Towel: Clases personalizadas para Matrices?

Creado en 8 jul. 2020  ·  4Comentarios  ·  Fuente: ZacharyPatten/Towel

Sé que puede usar clases definidas por el usuario para matrices, pero no puedo revisarlo. Digamos que quiero implementar mi flotador:

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
}

Luego creo dos matrices y trato de multiplicarlas.

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

Y luego cuelga. Creo que me falta algo, pero no pude encontrarlo en documentos o muestras, pero ¿cómo hago para que funcione?

Bug

Comentario más útil

Lo siento por la respuesta tardía. Parece haber un problema en mi código. En realidad, no está en el código de Matrix, está en mi método ComputePi que actualmente se ejecuta cuando accedo a la clase Constant<T> . Es probable que esta sea una solución fácil y probablemente la tenga lista mañana. :)

Lo que tengo que hacer es arreglar el bucle infinito que ocurre en el método ComputePi o tengo que evitar que todas las constantes se calculen en la clase Constant<T> . Aunque estoy accediendo a Constant<T>.Zero , actualmente también calcula Constant<T>.Pi ya que todos los miembros de esa clase son campos estáticos. Originalmente hice esto por razones de rendimiento.

Gracias por enviar el problema. Volveré a publicar sobre este problema cuando se solucione. :)

Todos 4 comentarios

Lo siento por la respuesta tardía. Parece haber un problema en mi código. En realidad, no está en el código de Matrix, está en mi método ComputePi que actualmente se ejecuta cuando accedo a la clase Constant<T> . Es probable que esta sea una solución fácil y probablemente la tenga lista mañana. :)

Lo que tengo que hacer es arreglar el bucle infinito que ocurre en el método ComputePi o tengo que evitar que todas las constantes se calculen en la clase Constant<T> . Aunque estoy accediendo a Constant<T>.Zero , actualmente también calcula Constant<T>.Pi ya que todos los miembros de esa clase son campos estáticos. Originalmente hice esto por razones de rendimiento.

Gracias por enviar el problema. Volveré a publicar sobre este problema cuando se solucione. :)

He solucionado el problema, aunque actualmente necesito algunos operadores más que los que tenía en su muestra. Todos los métodos de prueba para el proyecto Towel están dentro del proyecto Tools/Towel_Testing . Agregué un método de prueba para su muestra aquí:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737

Puedes ver que agregué los siguientes operadores:

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

En cuanto al método ComputePi ... Olvidé ++ una variable ... así que gracias por captar eso. Todavía hay margen de mejora, pero al menos eso solucionó el problema. :) Aquí estaba la línea en la que olvidé el ++ en: https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

No he actualizado el paquete nuget a partir de esta publicación, pero lo haré en un futuro próximo.

¿Hay una revisión para que pueda hacer que funcione ahora? ¿Quizás debería agregar otro método u operador?

Creo que este problema se solucionó en PR # 54. Si todavía hay un problema o más problemas, vuelva a abrir este problema o abra uno nuevo.

¿Fue útil esta página
0 / 5 - 0 calificaciones