问题标签 [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.

0 投票
2 回答
2331 浏览

c++ - 矩阵向量倍数与 dgemm

我在我的代码中做了大量的矩阵向量乘法。我发现我的幼稚实现在 MKL10 中击败了 cblas_dgemm。我自己猜测为什么会出现这种情况是 dgemm 执行 alpha*A *B + beta *C 而我只执行 A*B。但是幼稚的实现要好得多(约 3 倍加速)。任何想法为什么会这样?

这是矩阵向量乘数的实现:

0 投票
7 回答
2059 浏览

c++ - 解决浮点舍入问题 C++

我开发了一个科学应用程序(模拟在细胞核中移动的染色体)。染色体被分成小片段,这些片段使用 4x4 旋转矩阵围绕随机轴旋转。

问题是模拟执行了数千亿次旋转,因此浮点舍入误差会累积并呈指数增长,因此随着时间的流逝,片段往往会“飘走”并与染色体的其余部分分离。

我在 C++ 中使用双精度。该软件目前在 CPU 上运行,但将移植到 CUDA,并且模拟最多可以持续 1 个月。

我不知道如何以某种方式重新规范化染色体,因为所有片段都链接在一起(您可以将其视为双向链表),但如果可能的话,我认为这将是最好的主意。

你有什么建议吗 ?我觉得有点失落。

非常感谢你,

H。

编辑:添加了简化的示例代码。您可以假设所有矩阵数学都是经典实现。

0 投票
2 回答
1883 浏览

graphics - 用我的光线追踪器帮我解决这个错误

我不会为这个问题发布任何代码,因为它需要太多的上下文,但我会从概念上解释我在做什么。

我正在构建一个使用仿射变换的简单光线追踪器。我的意思是我将相机坐标中的所有光线与通用形状相交。这些形状都具有相关的仿射变换,光线首先乘以这些变换的倒数,然后再与场景对象相交。

例如,假设我想要一个位于 (10,10,10) 的半径为 3 的球体。我创建了球体并给它一个表示这个变换的变换矩阵。

我在相机坐标中创建了一条射线。我将射线乘以球体变换矩阵的逆矩阵,并将其与通用球体相交(r=1 在 (0,0,0) 处)。我在交叉点处沿这条通用射线的距离,并使用它找到通用法线和沿原始射线的点,并将它们保存到一个变换对象中(连同距离(t)和实际变换)。

当需要计算这个交点的颜色时,我采用变换的逆转置并将其乘以通用法线以找到法线。如果我使用来自逆变换射线的交点的t值,则交点就是沿原始未变换射线的点。

问题是,当我以这种方式做事时,转换会产生奇怪的效果。主要效果是变换似乎将灯光从场景中拖出。如果我构建一堆图像并在每一帧中对球体应用稍大的旋转,它似乎会拖动场景中的灯光。这是一个例子

老实说,我无法弄清楚我在这里做错了什么,但我正在扯掉我的头发。我想不出任何好的理由来发生这种情况。任何帮助将不胜感激。

0 投票
4 回答
14189 浏览

c - 在 C 中将两个 3x3 矩阵相乘

我正在尝试将两个 3x3 矩阵相乘。第一行和第二行的前 2 个数字是唯一正确的答案。我究竟做错了什么?我需要声明的东西mult_matrices吗?

0 投票
3 回答
3147 浏览

c - MPI矩阵-矩阵乘法的问题:集群比单台计算机慢

我使用 MPI 编写了一个小程序来并行化矩阵-矩阵乘法。问题是:在我的电脑上运行程序时,大约需要 10 秒才能完成,但在集群上大约需要 75 秒。我想我有一些同步问题,但我无法弄清楚(还)。

这是我的源代码:

0 投票
5 回答
2987 浏览

c++ - x86 有没有好的双精度小矩阵 SIMD 库?

我正在寻找一个专注于图形的小型(4x4)矩阵运算的 SIMD 库。有很多单精度的,但我需要同时支持单精度和双精度。

我看过英特尔的 IPP MX 库,但我更喜欢有源代码的东西。我对这些特定操作的 SSE3+ 实现非常感兴趣:

  1. Mat4 * Mat4
  2. Mat4 * Vec4
  3. Mat4 * Mat4 数组
  4. Mat4 * Vec4 数组
  5. Mat4 反转(很高兴拥有)

编辑:请不要“过早优化”答案。任何使用过小矩阵的人都知道 GCC 不会向量化这些以及手动优化的内在函数或 ASM。在这种情况下,这很重要,否则我不会问。

0 投票
2 回答
1315 浏览

java - 在 java 矩阵工具包 (MTJ) 中创建行向量

我需要实现一个乘法公式,其中一个大小为“n”的行矩阵将乘以一个 n*n 矩阵。

我已经使用 DenseMatrix 类从二维数组创建 n*n 矩阵...但我的问题是如何创建行向量...

我可以使用 CompRowMatrix 类来创建行矩阵...但是为此,输入必须是“矩阵”..但是 Matrix 是一个接口..无法实例化它.. CompRowMatrix 类的第一个构造函数表明它需要一个“非零索引数组”作为输入..但我无法理解这个非零索引数组是什么?

另外,我可以使用DenseVector或任何其他合适的类创建一个向量..但似乎没有方法可以直接将向量与矩阵相乘..

请帮助

0 投票
2 回答
2135 浏览

math - 光线追踪中的 3D 仿射变换问题

全部,

我正在编写一个相当非传统的光线追踪器来计算场景中各种物体的传热特性。在这个光线追踪器中,随机光线从我的原始对象的表面射入场景以检查交叉点。

这种特定的算法要求每条射线在原始空间中进行开发,然后由源对象仿射变换到世界空间,然后仿射变换回场景中其他对象的原始空间以检查相交。

一切都很好,直到我做了一个各向异性比例,例如按 [2 2 1] 缩放一个对象(各向同性比例很好)。这让我相信我没有正确地转换光线的方向分量。目前,我通过将方向分量乘以源对象逆变换矩阵的转置将光线方向从原始空间转换到世界空间,然后通过乘以目标对象变换的转置,将光线从世界空间转换到每个原始空间矩阵。

我还尝试乘以源图元的变换矩阵以从原始空间到世界空间,并乘以目标逆变换以从世界空间到原始空间,但这不成功。

我相信从原始物体表面(在随机点和随机方向)发射的光线应该以与“常规”光线追踪中的表面法线相同的方式进行转换,但我不确定。

那里的任何专家都知道我的方法中的缺陷是什么?随时询问是否需要更多信息。


该光线追踪器的基本算法如下:

希望能澄清这个问题,让我们看一个例子。假设我有一个沿 z 轴(单位半径和高度)延伸的圆柱体和一个位于 xy 平面内的环形空间,内径为 7,外径为 8。我希望在 x 和 y 中将圆柱体缩放 6 倍方向(但不是z方向)所以我的仿射变换矩阵如下:

现在假设我有一条射线,它在圆柱体 s 的表面上具有一个随机起点,并且在远离圆柱体 c 表面的一个随机方向上给出射线 r(os) = s + ct。

我想将此射线从原始(对象)空间转换为世界空间,然后测试与场景中的其他对象(环)的相交。

第一个问题是使用 M(圆柱体)或 M^-1(圆柱体)将射线 r(os) 转换到世界空间 r(ws) 的正确方法是什么。

第二个问题是使用 M(annulus) 和 M^-1(annulus) 将光线 r(ws) 从世界空间转换到对象空间以检查与其他对象相交的正确方法是什么。


一些额外的背景信息:

此应用程序用于计算 N 个对象之间的辐射传热。射线从物体上的随机点发射,其方向被随机选择以位于以随机点处的表面法线定向的半球形分布内。


这是我的问题的一些可视化。首次生成时的光线方向分布: 初始光线方向分布

如果我使用变换矩阵 M 将变换应用于世界坐标: M变换的方向

如果我使用逆变换矩阵 M^-1 将变换应用于世界坐标 由 M^-1 变换的方向

0 投票
2 回答
279 浏览

c++ - 关于线程的问题

我是线程编程的新手,我有一个概念问题。我正在为我的班级做矩阵乘法。但是,我在不使用线程的情况下执行此操作,然后使用线程计算答案矩阵的每个单元格的标量积,然后再次将第一个矩阵拆分为比例,以便每个线程都有相等的部分要计算。我的问题是标量产品实现很快就完成了,这是我所期望的,但是第三个实现并没有比非线程实现更快地计算出答案。例如,如果它使用 2 个线程,它会在大约一半的时间内计算它,因为它可以同时在矩阵的两半上工作,但事实并非如此。我觉得第三次实施中存在问题,我没有 不认为它是并行运行的,代码如下。谁能让我直截了当?并非所有代码都与问题相关,但我将其包括在内,以防问题不是本地问题。谢谢,

主程序:

矩阵文件:

0 投票
1 回答
1688 浏览

c++ - boost ublas矩阵产品的问题

我正在尝试使用 Boost 的 ublas 部分,但由于某种原因,我无法将矩阵相乘并将结果分配给其他矩阵。

这有效:

但是,如果我取消注释该行goo = prod(foo,foo);或尝试类似:

我收到一个我无法破译的运行时错误。

如何将矩阵相乘并分配结果?