ublas :: bounded_vector <> изменяется? - PullRequest
2 голосов
/ 15 января 2010

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

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

Из вики UBLAS Effective (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. Итак, во-первых, вы думаете, у них была веская причина не делать настоящие >> фиксированные << размер вектора или тип матрицы? </li>
  2. Как вы думаете, можно ли "продавать" этот ограниченный - в отличие от фиксированного размера - вектор для пользователей моей библиотеки как "фиксированного размера" замена вектора, даже названного "Vector3" или "Vector2", как это сделала вики-программа Uffective 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 голос
/ 11 апреля 2010

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

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

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

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

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

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

См. Также BoostLA , новая библиотека алгебры линейки, отправленная в Boost.

...