仅当列和行不同时,矩阵向量乘法

时间:2017-11-04 19:23:29

标签: r matrix matrix-multiplication

我正在实施Jacobi迭代方法来求解线性系统Ax = b

我有以下代码:

data.a <- c(3, -1, 1, 3, 6, 2, 3, 3, 7)
A <- matrix(data.a, nrow = 3, ncol = 3, byrow = TRUE)

b <- c(1, 0, 4)
Xo <- c(0,0,0)
X <- c(0, 0, 0)

 #A is the matrix:
     #3   -1    1
     #3    6    2
     #3    3    7

#b is the column vector:
#[1, 0, 4]

#and Xo is the previous X computed

for(i in 1:nrow(A)){
  sum = 0
  for(j in 1:ncol(A)){
    if(j != i){
      sum = sum + A[i,j]*Xo[j]
    }
  }

  X[i] = -(1/A[i,i])*(sum - b[i])
}

问题是,因为我只是将A[i][j]*Xo[j]的值j != i相加并求和  我正在使用嵌套的for循环并使用辅助变量sum。

我的问题是:我可以使用像

这样的东西吗?
A[i,] %*% Xo

计算没有嵌套for循环的和的值?

编辑:我找到了解决方案

X[i] = -(1/A[i,i])*(A[i,]%*%Xo - A[i,i]*Xo[i] - b[i])
# I subtracted the term A[i,i]*Xo[i] from the product A*Xo

1 个答案:

答案 0 :(得分:0)

你甚至可以通过制作一个矩阵R来删除第一个循环,其元素等于A,除了对角元素是零。

update <- function(x, A, b) {
  D <- diag(diag(A))
  R <- A - D

  sums <- R %*% x
  x <- (b - sums) / diag(D)
  x
}

data.a <- c(3, -1, 1, 3, 6, 2, 3, 3, 7)
A <- matrix(data.a, nrow = 3, ncol = 3, byrow = TRUE)
b <- c(1, 0, 4)

x <- c(0, 0, 0)
for (i in 1:100) x <- update(x, A, b)
x

# verify the answer is correct
solve(A, b)