Что лучше для реализации Матрицы (линейной алгебры) в C #, Class или Struct? - PullRequest
0 голосов
/ 05 июля 2019

Ради интереса я с нуля внедряю свой собственный Ray Tracer на ядре C # .NET, в который входят векторы, матрицы и другие артефакты линейной алгебры.

Вопрос: Каким должен быть правильный подход к матрицам, учитывая, что они будут использоваться для Ray Tracer (мне нужны только матрицы 2x2, 3x3 и 4x4) и учитывая производительность?

  1. Класс Matrix , вы можете определить его размер в конструкторе. Это означает отсутствие дублирования кода, но все будет храниться в куче, то есть сборщик мусора будет вызываться часто.
  2. Несколько структур для различных нестандартных размеров, которые мне нужны, например, Matrix2x2, Matrix3x3, Matrix4x4? Структуры в C # не поддерживают наследование, поэтому необходимо скопировать большой объем кода во всех структурах. С положительной стороны, эти матрицы будут храниться в стеке.
  3. Смешанный подход , следующий (2) и сохраняющий все сигнатуры метода, но вместо наличия логики там, используя вспомогательный статический класс, который имеет всю логику для управления этими структурами. С точки зрения пользователя, вам не нужно взаимодействовать с этим классом, но я не знаю, будет ли это излишним.

ПРИМЕЧАНИЕ: я не хочу использовать библиотеку для этого, вот и вся идея "С нуля":)

Я изучал другие библиотеки, созданные на C #, а также игровые движки, такие как Unity, для справки. Эти библиотеки обычно создают несколько структур с большим количеством дублирующегося кода. Я предполагаю, что это приемлемо, потому что эти структуры не должны изменяться слишком часто. Я более склонен делать (2), но я хотел бы проверить, что вы думаете о подходе (3)

Для структур я не могу использовать массивы, поэтому мне нужно явно создать N x N переменных для хранения значений матрицы. Хорошая вещь, которая делает подход (3) осуществимым, - это поддержка индексаторов C # (индексатор позволяет индексировать объект, такой как массив. Когда вы определяете индексатор для класса, этот класс ведет себя подобно виртуальному массиву), поэтому с точки зрения вспомогательного класса они будут выглядеть как массивы, что позволит создавать логику, которая будет работать с любым размером (2x2, 3x3 и 4x4)

Я буду признателен за ввод здесь.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...