Towel: Пользовательские классы для матриц?

Созданный на 8 июл. 2020  ·  4Комментарии  ·  Источник: ZacharyPatten/Towel

Я знаю, что вы можете использовать пользовательские классы для матриц, но я не могу пройти через это. Скажем, я хочу реализовать свой поплавок:

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
}

Затем я создаю две матрицы и пытаюсь их перемножить

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

А потом зависает. Я думаю, что мне что-то не хватает, но я не могу найти это в документах или примерах, но как мне заставить это работать?

Самый полезный комментарий

Извините за поздний ответ. Похоже, в моем коде есть проблема. На самом деле этого нет в коде матрицы, это в моем методе ComputePi который в настоящее время выполняется, когда я обращаюсь к классу Constant<T> . Скорее всего, это будет легкое исправление, и я, вероятно, его исправлю к завтрашнему дню. :)

Мне нужно либо исправить бесконечный цикл, происходящий в методе ComputePi либо мне нужно предотвратить вычисление всех констант в классе Constant<T> . Несмотря на то, что я обращаюсь к Constant<T>.Zero , он также в настоящее время вычисляет Constant<T>.Pi поскольку все члены этого класса являются статическими полями. Изначально я сделал это из соображений производительности.

Благодарим за отправку вопроса. Я опубликую сообщение об этой проблеме еще раз, когда она будет исправлена. :)

Все 4 Комментарий

Извините за поздний ответ. Похоже, в моем коде есть проблема. На самом деле этого нет в коде матрицы, это в моем методе ComputePi который в настоящее время выполняется, когда я обращаюсь к классу Constant<T> . Скорее всего, это будет легкое исправление, и я, вероятно, его исправлю к завтрашнему дню. :)

Мне нужно либо исправить бесконечный цикл, происходящий в методе ComputePi либо мне нужно предотвратить вычисление всех констант в классе Constant<T> . Несмотря на то, что я обращаюсь к Constant<T>.Zero , он также в настоящее время вычисляет Constant<T>.Pi поскольку все члены этого класса являются статическими полями. Изначально я сделал это из соображений производительности.

Благодарим за отправку вопроса. Я опубликую сообщение об этой проблеме еще раз, когда она будет исправлена. :)

Я устранил проблему, хотя в настоящее время мне требуется еще несколько операторов, чем те, которые использовались в вашем примере. Все методы тестирования для проекта Towel находятся внутри проекта Tools/Towel_Testing . Я добавил сюда метод тестирования для вашего образца:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mat 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://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

Я не обновлял пакет nuget на момент публикации этого сообщения, но сделаю это в ближайшем будущем.

Есть ли исправление, чтобы я мог заставить его работать сейчас? Может стоит добавить еще метод или оператор?

Я считаю, что эта проблема была исправлена ​​в PR №54. Если проблема не устранена или возникнут другие проблемы, пожалуйста, повторно откройте эту проблему или откройте новую.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги