的uBLAS :: bounded_vector<>正在调整大小?

时间:2010-01-14 23:50:38

标签: game-engine ublas

现在,说真的......我不会在这里使用坏词,因为我们正在讨论Boost研究员。以这种方式看东西绝对是我的错,但我不明白为什么,所以我会在这里问一下;也许有人可以在这件事上启发我。在这里:

uBLAS有一个名为bounded_vector<>的漂亮的类模板,用于创建固定大小的向量(或者我认为)。

来自有效的uBLAS维基(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<>。在这里,我问你:看起来这个有界向量的东西看起来不是固定大小吗?好吧,它没有。

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

  1. 所以,首先,你认为他们有充分的理由不做真正的&gt;&gt; 修复 &lt;&lt;尺寸矢量或矩阵类型?
  2. 你认为将有界 - 而不是固定大小 - 向我的图书馆用户“推销”为“固定 - ”是可以的大小“矢量替换,甚至命名为”Vector3“或”Vector2“,就像有效的uBLAS wiki一样吗?
  3. 您是否认为我应该以某种方式为此目的实现固定大小的矢量?如果是这样,怎么样? (对不起,但我是uBLAS的新手;今天就试过了)
  4. 我正在开发3D游戏。 uBLAS是否应该用于此计算所涉及的计算(“嘿,几何!”,每个有效的uBLAS维基)?如果没有,你会建议更换什么?
  5. - 编辑

    以防万一,是的,我已经读过这个警告:

      

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

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

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

    哦,来吧,这不是普通的背叛吗?

2 个答案:

答案 0 :(得分:1)

  1. ublas从未打算用于3D线性代数
  2. 主观和议论
  3. 我是为了学习表达模板而在我的代码库中完成的,请参阅4.现有解决方案
  4. 您正在开发3D游戏,然后忘记ublas。相反,我建议您使用cvalarrayEigen。两者都非常有效并且使用表达模板。 Eigen2甚至在某些情况下具有自动矢量化功能,提供求解器等...
  5. 另见BoostLA,一个提交给Boost的新linera代数库。

答案 1 :(得分:1)

游戏中的大多数内容通常都受到3D引擎库的支持。有大量有用的实用程序。例如我使用过Irrlicht(相对较小的引擎),但从来不必离开它们整齐的矢量,矩阵和算法的世界。

对于uBlas而言仍然有效的一个论点是它是事物的助推解决方案。你可以坚持你想要的任何强大的后端,并将其用于实际繁重的工作(搜索:增强ublas的数​​字绑定)。然后它作为其他库的抽象层,适用于模块化软件。因此,学习uBlas仍然是一种合理的练习,但是,与大多数提升一样,它缺乏直觉性,并且总是倾向于普遍性而不是可用性。 (再次,我的蓝调,sry。)

简而言之:这是一项很有价值的技巧,但是你可以使用你的3d lib提供的linalg或者更好的文档记录,以及一个很好的库。

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

bounded_vector只是不做动态扩展。