Towel: Classes personalizadas para matrizes?

Criado em 8 jul. 2020  ·  4Comentários  ·  Fonte: ZacharyPatten/Towel

Eu sei que você pode usar classes definidas pelo usuário para matrizes, mas não posso passar por isso. Digamos que eu queira implementar meu 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
}

Então eu crio duas matrizes e tento multiplicá-las

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

E então ele trava. Acho que estou faltando alguma coisa, mas não consegui encontrar nos documentos ou nas amostras, mas como faço para que funcione?

Bug

Comentários muito úteis

Desculpe pela resposta tardia. Parece haver um problema no meu código. Na verdade, não está no código Matrix, está no meu método ComputePi que atualmente é executado quando eu acesso a classe Constant<T> . Provavelmente será uma solução fácil e provavelmente terei a solução pronta amanhã. :)

O que preciso fazer é consertar o loop infinito que está acontecendo no método ComputePi ou evitar que todas as constantes sejam calculadas na classe Constant<T> . Mesmo que eu esteja acessando Constant<T>.Zero , ele também atualmente calcula Constant<T>.Pi já que todos os membros dessa classe são campos estáticos. Eu fiz isso originalmente por motivos de desempenho.

Obrigado por enviar o problema. Vou postar sobre esse problema novamente quando for corrigido. :)

Todos 4 comentários

Desculpe pela resposta tardia. Parece haver um problema no meu código. Na verdade, não está no código Matrix, está no meu método ComputePi que atualmente é executado quando eu acesso a classe Constant<T> . Provavelmente será uma solução fácil e provavelmente terei a solução pronta amanhã. :)

O que preciso fazer é consertar o loop infinito que está acontecendo no método ComputePi ou evitar que todas as constantes sejam calculadas na classe Constant<T> . Mesmo que eu esteja acessando Constant<T>.Zero , ele também atualmente calcula Constant<T>.Pi já que todos os membros dessa classe são campos estáticos. Eu fiz isso originalmente por motivos de desempenho.

Obrigado por enviar o problema. Vou postar sobre esse problema novamente quando for corrigido. :)

Corrigi o problema, embora atualmente exija mais alguns operadores do que apenas aqueles que você tinha em sua amostra. Todos os métodos de teste para o projeto Towel estão dentro do projeto Tools/Towel_Testing . Eu adicionei um método de teste para sua amostra aqui:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737

Você pode ver que adicionei os seguintes 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);

Quanto ao método ComputePi ... Esqueci de ++ uma variável ... então, obrigado por pegar isso. Ainda há espaço para melhorias, mas pelo menos isso corrigiu seu problema. :) Aqui estava a linha que esqueci de ++ em: https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

Eu não atualizei o pacote nuget neste post, mas farei isso em um futuro próximo.

Existe um hotfix para que eu possa fazer funcionar agora? Talvez eu deva adicionar outro método ou operador?

Acredito que esse problema foi corrigido no PR # 54. Se ainda houver um problema ou outros problemas, reabra esse problema ou abra um novo problema.

Esta página foi útil?
0 / 5 - 0 avaliações