ublas::bounded_vector<> изменяется?

Теперь серьезно... Я воздержусь от использования здесь плохих слов, потому что мы говорим о парнях из Boost. Должно быть моей ошибкой смотреть на вещи таким образом, но я не могу понять почему, поэтому я спрошу это здесь; Может быть, кто-то может просветить меня в этом вопросе. Здесь это идет:

У uBLAS есть этот хороший шаблон класса, который называется bounded_vector<> это используется для создания векторов фиксированного размера (или так я думал).

Из эффективной вики-страницы uBLAS ( http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Effective_UBLAS):

Тип вектора uBLAS и матрицы по умолчанию имеют переменный размер. Многие задачи линейной алгебры включают векторы с фиксированным размером. 2 и 3 элемента являются общими в геометрии! Хранилище фиксированного размера (похожее на массивы C) может быть эффективно реализовано, так как оно не связано с накладными расходами (управлением кучей), связанными с динамическим хранением. uBLAS реализует фиксированные размеры, изменяя базовое хранилище вектора / матрицы на "bounded_array" со значения по умолчанию "unbounded_array".

Хорошо, это bounded_vector<> вещь используется, чтобы освободить вас от указания основного хранилища вектора для bounded_array<> указанного размера. Здесь я спрашиваю вас: не похоже ли, что эта ограниченная векторная вещь имеет фиксированный размер для вас? Ну, это не так.

Сначала я чувствовал себя преданным вики, но потом я пересмотрел значение слова "ограниченный" и думаю, что могу позволить этому пройти. Но в случае, если вы, как и я (я все еще не уверен), все еще задаетесь вопросом, имеет ли это смысл, я обнаружил, что bounded_vector<> фактически может быть изменен, он может быть не больше размера, указанного в параметре шаблона.

  1. Итак, во-первых, как вы думаете, у них была веская причина не создавать настоящий >>фиксированный<< размерный вектор или матричный тип?
  2. Как вы думаете, можно ли "продавать" этот ограниченный - в отличие от фиксированного размера - вектор пользователям моей библиотеки в качестве замены вектора "фиксированного размера", даже с именем "Vector3" или "Vector2", например Эффективный UBLAS вики сделал?
  3. Как вы думаете, я должен как-то реализовать вектор с фиксированным размером для этой цели? Если так, то как? (Извините, но я действительно новичок в UBLAS; только что попробовал сегодня)
  4. Я занимаюсь разработкой 3D-игры. Следует ли использовать uBLAS для вычислений, связанных с этим ("эй, геометрия!", Согласно действующей вики uBLAS)? Какую замену вы бы предложили, если нет?

-- редактировать

И на всякий случай, да, я прочитал это предупреждение:

Следует отметить, что это только меняет хранилище, которое uBLAS использует для вектора3. uBLAS будет по-прежнему использовать тот же алгоритм (который предполагает переменный размер) для управления вектором3. На практике это не оказывает отрицательного влияния на скорость. Вышеприведенное работает так же быстро, как и созданный вручную вектор3, который не использует uBLAS. Единственное негативное влияние состоит в том, что vector3 всегда хранит элемент "size", который в этом случае является избыточным [или нет? Я имею в виду......].

Я вижу, что он использует тот же алгоритм, предполагая переменный размер, но если операция фактически изменит свой размер, разве она не должна быть остановлена ​​(утверждение)?

ublas::bounded_vector<float,3> v3;
ublas::bounded_vector<float,2> v2;
v3 = v2;
std::cout << v3.size() << '\n'; // prints 2

Да ладно, разве это не просто предательство?

2 ответа

  1. ublas никогда не предназначался для использования в трехмерной линейной алгебре
  2. субъективный и аргументативный
  3. Я сделал это в своей базе кода для изучения шаблонов выражений, см. 4. для существующих решений
  4. Вы разрабатываете 3D-игру, а затем забудьте о ublas, Вместо этого я предлагаю вам использовать cvalarray или Эйген. Оба очень эффективны и используют шаблоны выражений. Eigen2 даже поддерживает автоматическую векторизацию в некоторых ситуациях, предоставляет решатели и т.д.

Смотрите также BoostLA, новую библиотеку линейной алгебры, представленную в Boost.

Большинство вещей в играх обычно поддерживаются вашим движком 3D lib. С тоннами полезных утилит. Например, я использовал Irrlicht (относительно небольшой движок), но никогда не должен был покидать их аккуратно интегрированный мир векторов, матриц и алгоритмов.

Единственный аргумент, который до сих пор остается верным для uBlas, это то, что он является лучшим решением для вещей. Вы можете прикрепить любой мощный бэкэнд, какой захотите, и использовать его для тяжелой работы (поиск: увеличить числовые привязки для убласа). Затем он служит в качестве уровня абстракции для других библиотек, что хорошо для модульного программного обеспечения. Таким образом, изучение uBlas все еще является разумным упражнением, но, как и во многих случаях, ему не хватает интуитивности, и он всегда предпочитает универсальность, а не простоту использования. (снова идет мой блюз, сри.)

В двух словах: это ценный навык, но вы будете получать больше удовольствия от лагина, который предоставляет ваша 3d библиотека, или от eigen, который лучше задокументирован и окружен симпатичной библиотекой.

Это также причина легкого непоследовательности, которая вас раздражала. Интерфейс bounded_vector должен оставаться как можно ближе к интерфейсу нормального вектора. Я согласен, что эффект в вашем примере выглядит злым. Но если вы хотите оставаться совместимым с тем, как ведет себя обычный std::vector, у вас нет особого выбора.

bounded_vector просто не выполняет динамическое расширение.

Другие вопросы по тегам