Матричные вычисления C# и SVD с использованием собственного универсального типа (с числовыми данными Math.NET)

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

Я перегрузил все арифметические операторы, такие как +,-,*,/,‹,>, ... . Поэтому я полагаю, что у меня должно быть что-то вроде универсального типа (или я должен иметь возможность реализовать все остальное, чтобы сделать его одним).

Теперь я хочу работать/вычислять с моим типом. Поскольку я занимаюсь системами линейных уравнений, мне нужны такие вещи, как SVD, и я не хочу заново изобретать колесо, я планирую использовать существующие математические библиотеки, такие как Math. Числовые значения .NET. Но вот что говорит их матричный класс:

/// <summary>
    /// Defines the base class for <c>Matrix</c> classes.
    /// </summary>
    /// <typeparam name="T">Supported data types are <c>double</c>, <c>single</c>, <see cref="Complex"/>, and <see cref="Complex32"/>.</typeparam>
    [Serializable]
    public abstract partial class Matrix<T> :
        IFormattable, IEquatable<Matrix<T>>
#if !PORTABLE
        , ICloneable
#endif
        where T : struct, IEquatable<T>, IFormattable

Вкратце: Говорят, разрешены только двойные, одинарные и сложные. Так что мой универсальный тип не будет работать, даже если он реализует все перечисленные интерфейсы, верно?

Итак: я прав, что не могу использовать Math.Net Numerics с моим типом? Знаете ли вы другие математические библиотеки, которые будут поддерживать мой тип/универсальный? Мне действительно нужно писать свои собственные реализации?

Заранее спасибо!


person selmaohneh    schedule 13.02.2017    source источник
comment
Это связано с предыдущими вопросами о публикации ваших возможностей +, -, *, .... В С# нельзя. Очень жаль.   -  person Henk Holterman    schedule 13.02.2017
comment
@HenkHolterman, это не о C#. И дело не в операторах — вычислительные алгоритмы и ускоренные математические операции зависят от аппаратных реализаций или, по крайней мере, конкретных предположений. Когда что-то такое простое, как сложение, становится дорогим, вам нужно использовать другие алгоритмы или даже двоичные представления.   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
@selmaohneh каков результат сложения между двумя диапазонами? Или умножение? Разделение по дальности? Ваш общий класс не является универсальным, это вектор. Это совсем другая область математики.   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
@PanagiotisKanavos все операции между двумя интервалами и между интервалом и скаляром возвращают новый интервал. Например, [2, 4] + [1, 3] = [3, 7]   -  person selmaohneh    schedule 13.02.2017
comment
en.wikipedia.org/wiki/Interval_arithmetic#Simple_arithmetic   -  person selmaohneh    schedule 13.02.2017
comment
@PanagiotisKanavos - это явно недостаток ограничений универсального типа, я не вижу, при чем тут аппаратное обеспечение. Обратите внимание, что Complex приглашен на вечеринку.   -  person Henk Holterman    schedule 13.02.2017
comment
Я не хочу приглашать Комплекс, он может остаться дома. Комплекс может оставаться неопределенным.   -  person selmaohneh    schedule 13.02.2017
comment
Я имел в виду, что процитированный вами комментарий является указанием на некоторый код switch(typeof(T)) {} внутри этой библиотеки Numerics. И это не открыто для расширения.   -  person Henk Holterman    schedule 13.02.2017
comment
@selmaohneh вы пытаетесь использовать библиотеки, которые работают с отдельными числами, а не с интервалами или векторами. Интервал можно рассматривать как специализацию вектора.   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
@HenkHolterman, это не имеет ничего общего с ограничениями, это касается математики. Вы не можете рассматривать число как вектор или интервал. Не будут работать сами математические алгоритмы, потому что они не были созданы для таких чисел. Кстати, комплексные числа между прочим обрабатываются часто рассматриваются как векторы или преобразуются в полярные координаты для упрощения/ускорения алгоритмов.   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
@HenkHolterman, что касается оборудования - это очень важно. Math.NET и аналогичные библиотеки для обработки данных созданы для решения вычислительных задач. Скорость имеет значение, и алгоритмы реализованы для быстрого решения конкретных задач. Это не пакеты символьных вычислений. Простые операции должны быть простыми, то есть простыми инструкциями ЦП. Если возможно, такие операции ускоряются с помощью операций SIMD, подобных тем, которые появились в .NET 4.6. Вот почему им требуются простые типы, а не общие. Эта работа больше подходит для Mathematica   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
Я думаю, что вы должны прочитать вопрос еще раз.   -  person Henk Holterman    schedule 13.02.2017
comment
@HenkHolterman Я думаю, что OP должен искать библиотеки, поддерживающие интервалы, вместо того, чтобы пытаться заставить неподходящие библиотеки работать с интервалами.   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
@HenkHolterman также проверьте алгоритмы эффективного умножения матриц. Такие библиотеки, как Math.NET, по возможности не используют алгоритмы грубой силы, они используют другие алгоритмы для ускорения вычислений. Вот почему нельзя использовать алгоритм чисел для работы с интервалами. Это связано с математикой и алгоритмами, а не с языком реализации.   -  person Panagiotis Kanavos    schedule 13.02.2017
comment
@selmaohneh заметил, что класс абстрактный. источник показывает, что Math.NET содержит специализации для номеров float, double и Complex. Вам придется реализовать свои собственные матричные факторизации и, такие как SVD для него.   -  person Panagiotis Kanavos    schedule 14.02.2017
comment
@selmaohneh Math.NET также обеспечивает аппаратное ускорение для этих типов через Intel MKL. При активации специфичные для MKL версии операций, например DotProduct   -  person Panagiotis Kanavos    schedule 14.02.2017
comment
Для всех, кто заинтересован, я написал свою собственную библиотеку, которая может обрабатывать эти системы уравнений: github.com/selmaohneh/IntSharp   -  person selmaohneh    schedule 12.10.2017


Ответы (1)


Я не могу комментировать напрямую (из-за небольшой репутации), поэтому я должен опубликовать «ответ», мои извинения!

Я не думаю, что у вас есть «общий тип», это особый, пользовательский (не встроенный) тип.

Теперь предположим, что вы действительно можете использовать абстрактный класс Matrix (кстати, вы должны попробовать это сделать сами) для представления интервальной матрицы. На вас все равно осталась бы вся тяжелая работа, поскольку вычисление SVD интервальной матрицы, насколько мне известно, напрямую не связано с SVD какой-либо конкретной матрицы, или нет? Аналогично для интервальных вычислений собственного значения/собственного вектора.

person Giorgos Altanis    schedule 13.02.2017
comment
Тск, тск, тск. Правило существует не просто так - прежде чем комментировать, нужно понять, как работает сайт. Например, это ЯВЛЯЕТСЯ ответом! Математические библиотеки предназначены для математики. Числа — это не классы, которые каким-то образом реализуют интерфейс, а тем более общие классы. Быстрые математические библиотеки используют специальные алгоритмы вычислений и аппаратное ускорение, включая операции SIMD, такие как классы .NET Vector. - person Panagiotis Kanavos; 13.02.2017
comment
На самом деле все вычислительные алгоритмы зависят от того простого факта, что простая арифметика является простой. Если нет, то вам нужен другой алгоритм. Например, добавление считается дешевым. Если нет, например, в больших целых или комплексных числах, то используется другой алгоритм, чтобы покрыть эту стоимость. - person Panagiotis Kanavos; 13.02.2017
comment
@PanagiotisKanavos Арифметические операции между двумя интервальными числами (кстати, это очень хорошо определенная математическая сущность) просто определяются с точки зрения элементарных арифметических операций. Проблема в том, что вычисление сложных выражений далеко не тривиально, не говоря уже о вычислении таких величин, как собственные или сингулярные значения. {Приятно встретить вас здесь!} - person Giorgos Altanis; 13.02.2017
comment
Когда я говорю о простом, я имею в виду в смысле процессора — простые операции процессора. В вычислительных библиотеках, таких как Math.NET, для ускорения операций используются алгоритмы, отличные от тех, которым обучали на первых уроках математики. Кроме того, он будет использовать оптимизации и аппаратное ускорение, где это возможно. Вероятно, поэтому Math.NET ожидает double, но не Decimal - операции Decimal непросты и не могут быть ускорены операциями SIMD. - person Panagiotis Kanavos; 14.02.2017
comment
PS, ты должен купить пива - person Panagiotis Kanavos; 14.02.2017
comment
PPS, Math.NET имеет специальные реализации для одиночных, двойных, сложных и провайдеров с аппаратным ускорением. MKL задокументирован, но есть и другие поставщики как Cuda, OpenBLAS - person Panagiotis Kanavos; 14.02.2017