下三角矩阵向量积
Lower triangular matrix-vector product
在编程练习中,我得到了保存为数组的对称 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
我遇到的问题是我无法生成和添加 C(1) 的 2*B 和 C(2) 的 5*C。练习的目标是使用尽可能少的步骤和尽可能少的数组 space。
有什么建议吗?
您的代码存在多个问题:
- 在外循环中,你分配了
C(n)
(可能是对角线项),所以根本没有使用内循环的计算
- 您正在从后到前循环左下角的三角形,如果您将其反转,则矢量化矩阵内的索引会简单得多
- 计算矩阵内的位置(
k
和l
)是错误的
- 你没有计算镜像元素的乘积
以下是我的解决方案,满足以上几点:
! 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
在编程练习中,我得到了保存为数组的对称 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
我遇到的问题是我无法生成和添加 C(1) 的 2*B 和 C(2) 的 5*C。练习的目标是使用尽可能少的步骤和尽可能少的数组 space。
有什么建议吗?
您的代码存在多个问题:
- 在外循环中,你分配了
C(n)
(可能是对角线项),所以根本没有使用内循环的计算 - 您正在从后到前循环左下角的三角形,如果您将其反转,则矢量化矩阵内的索引会简单得多
- 计算矩阵内的位置(
k
和l
)是错误的 - 你没有计算镜像元素的乘积
以下是我的解决方案,满足以上几点:
! 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