下三角矩阵矢量积

时间:2017-07-14 02:43:52

标签: fortran matrix-multiplication

对于编程练习,给出了对称3x3矩阵的下三角元素,保存为数组

|1 * *|

|2 4 *| => [1,2,3,4,5,6]

|3 5 6|

我需要使乘积C(i)= C(i)+ M(i,j)V(j)其中M是对称矩阵,V是矢量。

V =>[A,B,C]
C(1)=1*A + 2*B + 3*C
C(2)=2*A + 4*B + 5*C
C(3)=3*A + 5*B + 6*C

我正在尝试制作一种可以执行此产品的高效算法

我可以很容易地生成我需要的所有产品C(3)但是,当我尝试生成值C(1),C(2)并且我不知道如何解决这个问题时我遇到了问题没有额外的记忆。

这就是我所做的

k=6
n=3

  DO 1 j = n,1,-1
    l= k
    DO 2 i = n,j + 1,-1
       C(i) = C(i) + V(j)*M(l)
       l = l - 1           
2   enddo             
    C(j) = V(j)*M(k-n+j)
    k = k - (n-j+1)
1 enddo

我遇到的问题是我无法生成并添加2 * B用于C(1)和5 * C用于C(2)。练习的目标是使用尽可能少的步骤和尽可能少的阵列空间。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您的代码存在多个问题:

  • 在外部循环中,您指定C(n)(可能是对角线条目),因此根本不使用内部循环的计算
  • 你正在从左到右循环左下三角形,如果你反过来,矢量化矩阵内的索引会更加简单
  • 矩阵内的位置计算(kl)错误
  • 您不计算镜像元素的产品

以下是我的解决方案:

  ! Loop over all elements in the lower left triangle
  k = 0
  do j=1,n
    ! Increment the position inside the unrolled matrix
    k = k+1
    ! diagonal entries, i = j
    c(j) = c(j) + v(j)*M(k)

    ! off-diagonal entries
    do i=j+1,n
      ! Increment the position inside the unrolled matrix
      k = k+1
      ! Original entry
      c(i) = c(i) + v(j)*M(k)
      ! Mirrored one
      c(j) = c(j) + v(i)*M(k)
    enddo !i
  enddo !j