【发布时间】:2017-04-22 17:44:30
【问题描述】:
我有两个矩阵,其中第一个矩阵是从第二个矩阵的数据创建的,用于转换第二个矩阵。我重复这个操作很多次。由于这两个矩阵的依赖关系,我一直没能找到一种方法来加快这里的操作。我会尝试用小矩阵大小向你展示我在说什么。
[ 1 0 0 0 ] [ .11 .22 .33 .44 ]
[ 0 1 0 0 ] [ .65 .42 .01 .92 ]
[ 0 0 .51^2 .85^2 ] * [ .31 .15 .51 .85 ]
[ 0 0 .44^2 .23^2 ] [ .25 .78 .44 .23 ]
A B
假设我执行此操作数百万次,计算值在 A 中的位置取决于我希望在 B 中发生旋转的位置。因此,在每次迭代中,矩阵 A 和 B 都不同,并且使用的值计算要放在 A 中的新值是不同的。
有谁知道加速这类代码的方法?考虑到矩阵乘法本质上是向量矩阵乘法,我希望创建一个组合 A(展开到 A 是一个完整矩阵的点,或者足够充分以利用 MMM 算法),但是新值的数据依赖性使看来我可能被卡住了。我得到这样的东西:
A * B = B'
A' * B' = B''
A'' * B'' = B'''
其中 A' 派生自 B',A'' 派生自 B'',依此类推。
编辑:
为了澄清,第二轮可能是:
[ 1 0 0 0 ] [ .11 .22 .33 .44 ]
[ 0 .65^2 .42^2 0 ] [ .65 .42 .01 .92 ]
[ 0 .26^2 .60^2 0 ] * [ .26 .60 .45 .39 ]
[ 0 0 0 1 ] [ .06 .04 .10 .17 ]
A' B'
【问题讨论】:
-
Will A, A', A'', ... 的形式总是 A = [I, 0; 0,X]?如果是这样,您应该简化问题以删除 B 的上半部分以及 A 的下对角块以外的所有部分(例如,B' = [B_top; X*B_bottom])。
-
不,A 并不总是如图所示。四个旋转元素可以在对角线上的任何位置。
-
矩阵的大小总是 4x4 还是更大?
-
此外,是否会有 2 行/列恰好在对角线上为 1,或者这个数字可以增加吗?
-
@NoseKnowsAll 两个矩阵都非常大。我只是使用一个较小的例子。 A 开始是一个非常大的单位矩阵,我写入了我想用来变换矩阵 B 的四个值。这四个值总是跨越对角线,如图所示。
标签: c matrix matrix-multiplication