Vector Fortran:仅包含+;1和-1作为条目

Vector Fortran:仅包含+;1和-1作为条目,vector,matrix,fortran,multiplication,Vector,Matrix,Fortran,Multiplication,在fortran9x中,用什么有效的方法(就CPU时间和/或内存需求而言)将任意的M x N矩阵(例如A)与任意(密集的)N维向量v相乘,该矩阵只包含+1和-1作为其条目(并且完全填充!) 非常感谢,, 奥斯莫 另外,A(即M和N)的大小在编译时未知 我的猜测是,如果只进行乘法运算,而不是通过检查矩阵元素的符号并进行相应的加法/减法来避免乘法运算,那么速度会更快。因此,只需使用一个通用的优化矩阵向量乘法例程。例如,BLAS的xGEMV。根据使用场景,如果必须多次应用同一矩阵,则可以将其分为两部分

在fortran9x中,用什么有效的方法(就CPU时间和/或内存需求而言)将任意的M x N矩阵(例如A)与任意(密集的)N维向量v相乘,该矩阵只包含+1和-1作为其条目(并且完全填充!)

非常感谢,, 奥斯莫


另外,A(即M和N)的大小在编译时未知

我的猜测是,如果只进行乘法运算,而不是通过检查矩阵元素的符号并进行相应的加法/减法来避免乘法运算,那么速度会更快。因此,只需使用一个通用的优化矩阵向量乘法例程。例如,BLAS的xGEMV。

根据使用场景,如果必须多次应用同一矩阵,则可以将其分为两部分,一部分为正条目,另一部分为负条目。 有了它,您可以避免乘法的需要,但是它会引入一个间接寻址,它可能比乘法更昂贵。
因此,janneb的解决方案可能是最合适的。

janneb,谢谢。在我自己试图想出一个“聪明”的解决方案后,我得出了类似的结论。我现在想知道矩阵A是否提前知道是否重要?为了提供上下文,假设a-在预期应用中通常较大,但“很瘦”,例如(10^4到10^6)x(2到12)-被生成(在Matlab表示法中)为a=符号(randn(1e5,6))(a需要具有“随机”字符),并且被使用,但没有(重新)生成,在迭代算法中重复。这不是一个xGEMV例程吗?Steabert,谢谢你的评论。没错,blas2例程xGEMV通常更适合执行“优化”矩阵向量积。然而,我想说的是,矩阵的特殊结构(只有+1和-1作为条目)是否可能带来一些优势,可能假设“提前”了解“全部”(可能是一个“愚蠢”的想法,但我想知道在这种情况下是否“预编译”(一部分)matvec计算是可能的,如果是正的,它会导致任何有效的结果,至少在计算时间方面是如此)。再次感谢。@Osmo Bajric-矩阵是否有其他特殊特征(对称或类似)?充满零的矩阵可以看作是一种特殊情况,但+1和-1只是数字;我不熟悉任何将这些视为特例的函数。对电脑来说+1和+3是一样的。Rook,谢谢加入。不,除了以(准)随机方式填充+1和-1之外,矩阵一般没有特殊的结构/特征(对于某些强大但尚未广为人知的线性迭代解算器,如ML(k)BiCGStab或IDR(s))而言,需要“鲁棒性”或方便性)。注意:为了避免可能的混淆,这里的瘦A不是来自A*x=B的A,而是在迭代方案中形成(某些)剩余向量的(线性独立的)“阴影”矩阵(符号(m>>N的randn(m,N)通常产生一个条件相当好的矩阵)我理解你的意思。不过,我“觉得”在Av的这种特殊情况下,一般Blas例程应该是可能的,其中A是MxN和M