2

现在,说真的……我会避免在这里使用坏词,因为我们正在谈论 Boost 研究员。这么看肯定是我的错,但我不明白为什么,所以在这里问一下;也许有人可以在这件事上启发我。它是这样的:

uBLAS 有一个很好的类模板,叫做bounded_vector<>它用于创建固定大小的向量(或者我认为是这样)。

来自有效的 uBLAS wiki ( http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Effective_UBLAS ):

默认的 uBLAS 向量和矩阵类型是可变大小的。许多线性代数问题涉及具有固定大小的向量。2和3元素在几何中很常见!固定大小的存储(类似于 C 数组)可以有效地实现,因为它不涉及与动态存储相关的开销(堆管理)。uBLAS 通过将向量/矩阵的底层存储从默认的“unbounded_array”更改为“bounded_array”来实现固定大小。

好吧,这个bounded_vector<>东西是用来让你免于将向量的底层存储指定为bounded_array<>指定大小的a。在这里我问你:看起来这个有界向量的东西对你来说不是固定大小的吗?好吧,它没有。

起初我觉得被 wiki 背叛了,但后来我重新考虑了“有界”的含义,我认为我可以让它过去。但是如果你和我一样(我仍然不确定),仍然想知道这是否有意义,我发现bounded_vector<>实际上可以调整大小,它可能不会大于指定为模板参数的大小。

  1. 那么,首先,您认为他们有充分的理由不制作真正的 >>固定<< 大小向量或矩阵类型吗?
  2. 您是否认为可以将这个有界(而不是固定大小)向量“出售”给我的库的用户作为“固定大小”向量替换,甚至命名为“Vector3”或“Vector2”,例如uBLAS wiki 有效吗?
  3. 你认为我应该为此目的以某种方式实现一个固定大小的向量吗?如果是这样,怎么做?(抱歉,我对 uBLAS 真的很陌生;今天刚试过)
  4. 我正在开发一款 3D 游戏。uBLAS 是否应该用于其中涉及的计算(“嘿,几何学!”,根据 Effective uBLAS wiki)?如果没有,你会建议什么替代品?

- 编辑

以防万一,是的,我已阅读此警告:

应该注意的是,这只改变了 uBLAS 用于 vector3 的存储。uBLAS 仍将使用所有相同的算法(假设大小可变)来操作向量3。实际上,这似乎对速度没有负面影响。上面的运行速度与不使用 uBLAS 的手工制作的 vector3 一样快。唯一的负面影响是 vector3 总是存储一个“大小”成员,在这种情况下是多余的[或者不是吗?我是说......]。

我看到它使用相同的算法,假设大小可变,但是如果操作要实际更改其大小,不应该停止(断言)吗?

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

哦,拜托,这不就是单纯的背叛吗?

4

2 回答 2

1

游戏中的大多数东西通常都由您的 3D 引擎库支持。拥有大量有用的实用程序。例如,我使用了 Irrlicht(相对较小的引擎),但从未离开过它们整齐集成的向量、矩阵和算法世界。

对 uBlas 仍然有效的一个论点是,它是事物的增强解决方案。您可以将任何您想要的强大后端粘贴在其后面,并将其用于实际的繁重工作(搜索:提升 ublas 的数字绑定)。然后它作为其他库的抽象层,这对模块化软件很有好处。因此,学习 uBlas 仍然是一项合理的练习,但与许多提升一样,它缺乏直观性,并且总是更喜欢通用性而不是可用性。(我的忧郁又来了,对不起。)

简而言之:这是一项很有价值的技能,但你会从你的 3d 库提供的 linalg 或 eigen 中获得更多乐趣,它有更好的文档记录并且围绕着一个不错的库。

这也是让你烦恼的轻微不连贯的原因。bounded_vector 的接口应尽可能靠近法线向量的接口。我同意你的例子中的效果看起来很邪恶。但是,如果您想与普通的 std::vector 行为保持兼容,那么您别无选择。

bounded_vector 只是不做动态扩展的东西。

于 2010-04-11T12:33:16.637 回答
1
  1. ublas从未打算用于 3D 线性代数
  2. 主观的和争论的
  3. 为了学习表达式模板,我在我的代码库中做了它,参见 4. 现有解决方案
  4. 您正在开发 3D 游戏,然后忘记ublas. 相反,我建议您使用cvalarrayor Eigen。两者都非常高效并使用表达式模板。Eigen2 甚至在某些情况下具有自动矢量化功能,提供求解器等......

另请参阅BoostLA,这是一个提交给 Boost 的新线性代数库。

于 2010-01-15T00:00:46.277 回答