問題タブ [matrix-multiplication]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 浮動小数点の丸めの問題を解決する C++
科学的応用 (細胞核内を移動する染色体のシミュレーション) を開発しています。染色体は、4x4 回転行列を使用してランダムな軸を中心に回転する小さな断片に分割されます。
問題は、シミュレーションが数千億回の回転を実行するため、浮動小数点の丸め誤差が積み重なって指数関数的に大きくなるため、時間の経過とともにフラグメントが「浮動」して染色体の残りの部分から切り離される傾向があることです。
C++ で倍精度を使用します。ソフトは今のところ CPU で実行されますが、CUDA に移植され、シミュレーションは最大で 1 か月持続します。
すべてのフラグメントが連鎖しているため(二重リンクリストとして表示できます)、どうにかして染色体を再正規化する方法はわかりませんが、可能であればそれが最善のアイデアだと思います。
何か提案はありますか ?少し損した気分です。
どうもありがとうございました、
H.
編集: 簡略化されたサンプル コードを追加しました。すべての行列演算は古典的な実装であると想定できます。
graphics - レイトレーサーでこのバグを解決するのを手伝ってください
あまりにも多くのコンテキストが必要になるため、この質問のコードは投稿しませんが、私が行っていることを概念的に説明します。
アフィン変換を使用する単純なレイトレーサーを構築しています。つまり、カメラ座標からのすべての光線を一般的な形状と交差させているということです。すべての形状にはアフィン変換が関連付けられており、シーンオブジェクトと交差する前に、光線は最初にこれらの変換の逆数で乗算されます。
たとえば、半径3の球を(10,10,10)に配置したいとします。球を作成し、この変換を表す変換行列を与えます。
カメラ座標で光線を作成します。光線に球の変換行列の逆数を掛けて、一般的な球と交差させます((0,0,0)でr = 1)。交点でこの一般的な光線に沿った距離を取り、それを使用して、一般的な法線と元の光線に沿った点を見つけ、これらを変換オブジェクトに保存します(距離(t)と実際の変換とともに)。
この交点の色を理解するときが来たら、変換の逆転置を取り、それを一般的な法線で乗算して法線を見つけます。逆変換された光線の交点からのt値を使用する場合、交点は元の変換されていない光線に沿った点にすぎません。
問題は、私がこのように物事を行うとき、変換が奇妙な効果をもたらすことです。主な効果は、変換によってライトがシーンから引きずられるように見えることです。たくさんの画像を作成し、フレームごとに球に少し大きな回転を適用すると、シーン内のライトがその周りをドラッグしているように見えます。これが例です
正直なところ、ここで何が間違っているのか理解できませんが、髪を引き裂いています。これが起こっている理由は何も考えられません。どんな助けでも大歓迎です。
c - C での 2 つの 3x3 行列の乗算
2 つの 3x3 行列を乗算しようとしています。1 行目と 2 行目の最初の 2 つの数字のみが正解です。私は何を間違っていますか?必要なものは で宣言されていmult_matrices
ますか?
c - MPI 行列 - 行列乗算の問題: 単一のコンピューターよりクラスターが遅い
MPI を使用して小さなプログラムをコーディングし、行列と行列の乗算を並列化します。問題は、私のコンピューターでプログラムを実行すると、完了するまでに約 10 秒かかりますが、クラスターでは約 75 秒かかることです。同期の問題があると思いますが、(まだ)わかりません。
ここに私のソースコードがあります:
c++ - x86用の優れた倍精度の小さなマトリックスSIMDライブラリはありますか?
グラフィック用のSIMDライブラリに焦点を当てた小さな(4x4)行列演算を探しています。単精度のものはたくさんありますが、単精度と倍精度の両方をサポートする必要があります。
IntelのIPPMXライブラリを見てきましたが、ソース付きのものがいいと思います。私はこれらの特定の操作のSSE3+実装に非常に興味があります:
- Mat4 * Mat4
- Mat4 * Vec4
- Mat4*Mat4の配列
- Mat4*Vec4の配列
- Mat4反転(持っているといい)
編集:「時期尚早の最適化」の答えはありません。小さな行列を扱ったことがある人なら誰でも、GCCがこれらをベクトル化せず、手動で最適化された組み込み関数やASMもベクトル化しないことを知っています。そしてこの場合、それは重要です、さもなければ私は尋ねないでしょう。
java - Java Matrix Toolkit (MTJ) で行ベクトルを作成する
サイズ 'n' の行行列を n*n 行列で乗算する乗算式を実装する必要があります。
DenseMatrix クラスを使用して 2D 配列から n*n 行列を作成しました...しかし、私の問題は行ベクトルを作成する方法です...
CompRowMatrix クラスを使用して行マトリックスを作成できます...しかし、そのためには、入力は「マトリックス」である必要があります..しかし、マトリックスはインターフェイスです..インスタンス化できません..CompRowMatrix クラスの最初のコンストラクターは、それが必要であると述べています入力としての「インデックスのゼロ以外の配列」..しかし、このゼロ以外のインデックスの配列が何であるかを理解できません??
また、 DenseVectorまたはその他の適切なクラスを使用してベクトルを作成することもできます..しかし、ベクトルを行列で直接乗算する方法はないようです..
助けてください
math - レイトレーシングにおける3Dアフィン変換の問題
全て、
シーン内のさまざまなオブジェクトの熱伝達特性を計算するために、従来とは異なるレイトレーサーを作成しています。このレイトレーサーでは、ランダムな光線がプリミティブオブジェクトの表面からシーンに発射され、交差をチェックします。
この特定のアルゴリズムでは、各光線をプリミティブ空間で展開し、ソースオブジェクトによってワールド空間にアフィン変換し、その後、シーン内の他のオブジェクトのプリミティブ空間にアフィン変換して交差をチェックする必要があります。
たとえば、オブジェクトを[2 2 1]でスケーリングするなど、異方性スケールを実行するまでは、すべて問題ありません(等方性スケールは問題ありません)。これは、私が光線の指向性成分を正しく変換していないと私に信じさせます。現在、方向成分にソースオブジェクトの逆変換行列の転置を掛けて光線の方向をプリミティブ空間からワールド空間に変換し、次に宛先オブジェクトの転置を掛けて光線をワールド空間から各プリミティブ空間に変換します。マトリックス。
また、ソースプリミティブの変換行列を乗算してプリミティブからワールド空間に移動し、宛先の逆変換を乗算してワールド空間からプリミティブ空間に移動しようとしましたが、失敗しました。
プリミティブオブジェクトの表面から(ランダムな点でランダムな方向に)発射された光線は、「通常の」レイトレーシングの表面法線と同じ方法で変換する必要があると思いますが、確かではありません。
私の方法論の欠陥が何であるかを知っている専門家はいますか?さらに情報が必要かどうかお気軽にお問い合わせください。
このレイトレーサーの基本的なアルゴリズムは次のとおりです。
うまくいけば、質問をクリアするために例を見てみましょう。z軸(単位半径と高さ)に沿って伸びる円柱と、内径7と外径8のxy平面にある環があるとします。xとyの係数6で円柱をスケーリングします。方向(z方向ではない)なので、私のアフィン変換行列は次のようになります。
ここで、円柱sの表面にランダムな開始点があり、円柱cの表面からランダムな方向に離れて光線r(os)= s+ctを与える光線があるとします。
この光線をプリミティブ(オブジェクト)空間からワールド空間に変換してから、シーン内の他のオブジェクト(環)との交差をテストしたいと思います。
最初の質問は、M(円柱)またはM ^ -1(円柱)を使用して、光線r(os)を世界空間r(ws)に変換する正しい方法は何ですか。
2番目の質問は、光線r(ws)をワールド空間からオブジェクト空間に変換し、M(環)とM ^ -1(環)を使用して他のオブジェクトとの交差をチェックする正しい方法は何ですか。
いくつかの追加の背景情報:
このアプリケーションは、N個のオブジェクト間の放射熱伝達を計算するためのものです。光線はオブジェクト上のランダムな点から発射され、その方向はランダムな点で表面法線に向けられた半球分布内にあるようにランダムに選択されます。
これが私の問題の視覚化です。最初に生成されたときの光線の方向分布:
変換行列Mを使用して世界座標に変換を適用すると、次のようになります。
逆変換行列M^-1を使用して世界座標に変換を適用すると
c++ - スレッドに関する質問
私はスレッドプログラミングが初めてで、概念的な問題があります。クラスのプロジェクトとして行列乗算を行っています。ただし、スレッドを使用せずに実行し、スレッドを使用して回答行列の各セルのスカラー積を計算し、最初の行列を比率に分割して、各スレッドが計算する部分が等しくなるようにします。私の問題は、スカラー積の実装が非常に迅速に終了することです。これは私が期待することですが、3 番目の実装では、スレッド化されていない実装よりもはるかに高速に答えが計算されません。たとえば、2 つのスレッドを使用する場合、行列の両方の半分を同時に処理できるため、約半分の時間で計算されますが、まったくそうではありません。3 番目の実装に問題があるように感じますが、そうではありません。並列に動作するとは思わないので、コードを以下に示します。誰かがこれについて私をまっすぐに設定できますか? すべてのコードが質問に関連しているわけではありませんが、問題がローカルではない場合に備えて含めました。ありがとう、
主なプログラム:
マトリックス ファイル:
c++ - ブーストublasマトリックス製品の問題
Boostのublas部分を使用しようとしていますが、何らかの理由で行列を乗算してその結果を他の行列に割り当てることができません。
これは機能します:
しかし、私がその行のコメントを外しgoo = prod(foo,foo);
たり、次のようなことを試みたりした場合:
解読できないランタイムエラーが発生します。
行列を乗算して結果を割り当てるにはどうすればよいですか?
opengl - OpenGL2D回転の問題
次のプログラムでは、簡単な家を描いています。座標は家の配列で定義されます。家を回転させて、元の家と同じように回転させて表示する必要があります。しかし、なぜ回転した家が表示されないのですか?