【问题标题】:ublas::bounded_vector<> being resized?ublas::bounded_vector<> 正在调整大小?
【发布时间】:2010-01-14 23:50:38
【问题描述】:

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

uBLAS 有一个名为 bounded_vector&lt;&gt; 的不错的类模板,用于创建固定大小的向量(或者我是这么认为的)。

来自 Effective 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&lt;&gt; 的东西是用来让你免于将向量的底层存储指定为指定大小的bounded_array&lt;&gt;。在这里我问你:看起来这个有界向量的东西对你来说不是固定大小的吗?好吧,它没有。

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

  1. 那么,首先,您认为他们有充分的理由不制作真正的>>固定
  2. 您认为将这个 bounded(与 fixed-size 相反)向量“出售”给我图书馆的用户作为“fixed- size”向量替换,甚至命名为“Vector3”或“Vector2”,就像 Effective 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

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

【问题讨论】:

    标签: game-engine ublas


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

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

    【讨论】:

    • 啊,我知道我一定是错的。但是 wiki 看起来确实具有误导性。关于#2,坦率地说,这不是主观的。删除问题中的所有“装饰品”,您会得到:在您自己的库的文档中编写误导性谎言是否正确?它可能是反讽的,但它肯定不是主观的。您也可以这样解读:“wiki 真的这样做了还是我遗漏了什么?”。
    • 我必须主观地评论#1:那它是做什么用的? (抱歉,我目前有提振蓝调,所以请随意忽略这个)。
    • 我想说的大型稀疏矩阵
    【解决方案2】:

    您的 3D 引擎库通常支持游戏中的大部分内容。拥有大量有用的实用程序。例如我使用过 Irrlicht(相对较小的引擎),但从来没有离开过它们整齐集成的向量、矩阵和算法世界。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      相关资源
      最近更新 更多