现在,说真的……我会避免在这里使用坏词,因为我们正在谈论 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<>
实际上可以调整大小,它可能不会大于指定为模板参数的大小。
- 那么,首先,您认为他们有充分的理由不制作真正的 >>固定<< 大小向量或矩阵类型吗?
- 您是否认为可以将这个有界(而不是固定大小)向量“出售”给我的库的用户作为“固定大小”向量替换,甚至命名为“Vector3”或“Vector2”,例如uBLAS wiki 有效吗?
- 你认为我应该为此目的以某种方式实现一个固定大小的向量吗?如果是这样,怎么做?(抱歉,我对 uBLAS 真的很陌生;今天刚试过)
- 我正在开发一款 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
哦,拜托,这不就是单纯的背叛吗?