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<>ここで私はあなたに尋ねます: この有界ベクトルは固定サイズのように見えませんか? まあ、それはありません。

最初はwikiに裏切られた気がしましたが、「限界」の意味を再考し、それを通過できると思います. しかし、私のように(私はまだ確信が持てません)、これが理にかなっているのかどうかまだ疑問に思っている場合、私が見つけたのは、bounded_vector<>実際にはサイズを変更できるということです

  1. まず最初に、実際の >>固定<< サイズのベクトルまたは行列型を作らない正当な理由があったと思いますか?
  2. 固定サイズとは対照的に、この有界のベクトルを私のライブラリのユーザーに「固定サイズ」のベクトルの代替として「販売」しても問題ないと思いますか?効果的な uBLAS wiki はありましたか?
  3. この目的のために固定サイズのベクトルを何らかの方法で実装する必要があると思いますか? もしそうなら、どのように?(申し訳ありませんが、私は uBLAS に本当に慣れていないので、今日試してみました)
  4. 私は3Dゲームを開発しています。これに関連する計算に uBLAS を使用する必要がありますか ("hey, geometry!"、Effective uBLAS wiki による)。そうでない場合、どのような代替品を提案しますか?

- 編集

念のため、はい、次の警告を読みました。

これは、uBLAS が vector3 に使用するストレージのみを変更することに注意してください。uBLAS は、同じアルゴリズム (可変サイズを想定) を使用して vector3 を操作します。実際には、これは速度に悪影響を及ぼさないようです。上記は、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
  1. ublas3D線形代数に使用することを意図したものではありませんでした
  2. 主観的で論争的
  3. 式テンプレートを学習するために、コードベースでそれを行いました。既存のソリューションについては、4. を参照してください。
  4. 3D ゲームを開発している場合は、ublas. 代わりに、cvalarrayまたはEigenを使用することをお勧めします。どちらも非常に効率的で、式テンプレートを使用します。Eigen2 は、状況によっては自動ベクトル化機能を備えており、ソルバーなどを提供しています...

Boost に提出された新しい線形代数ライブラリであるBoostLAも参照してください。

于 2010-01-15T00:00:46.277 に答える
1

ゲームのほとんどは、通常、3D エンジン ライブラリによってサポートされています。便利なユーティリティがたくさんあります。たとえば、私は Irrlicht (比較的小さなエンジン) を使用しましたが、ベクトル、行列、およびアルゴリズムのきちんと統合された世界を離れる必要はありませんでした。

uBlas についていまだに有効な議論の 1 つは、それが物事のブースト ソリューションであるということです。その背後に必要な強力なバックエンドを貼り付けて、それを実際の重い作業に使用できます (検索: ublas の数値バインディングを高める)。次に、モジュラーソフトウェアに適した他のライブラリへの抽象化レイヤーとして機能します。したがって、uBlas を学習することは依然として合理的な練習ですが、多くのブーストと同様に、直感性に欠けており、常に使いやすさよりも一般性を好みます. (またブルースが鳴ります、悲しいです。)

一言で言えば、それは貴重なスキルですが、3d ライブラリが提供する linalg や、より適切に文書化されていて素敵なライブラリの周りにある固有値を使用すると、より楽しくなります。

それが、あなたをイライラさせたわずかな矛盾の理由でもあります。bounded_vector のインターフェイスは、法線ベクトルのインターフェイスにできるだけ近づける必要があります。あなたの例の効果が悪に見えることに同意します。ただし、通常の std::vector の動作との互換性を維持したい場合は、選択肢があまりありません。

bounded_vector は、動的な拡張を行いません。

于 2010-04-11T12:33:16.637 に答える