正向替换打包数组

时间:2016-10-19 10:14:37

标签: arrays algorithm matlab linear-algebra

所以我试图创建一个脚本,它将获取一个数组,将其转换为打包形式,然后针对它运行Cholesky因子分解,最后使用前向和后向替换来解决它(Ax=b) 。

我遇到的麻烦是为打包数组创建正向替换(列式)算法。我已经正确地完成了向后替换,但是我似乎无法正确地转换算法。

这是我当前的后向替换算法(这是完美的)

x = b;
p = n*(n+1)/2;

for j = n:-1:1
  x(j) = x(j) / u(p);
  p = p - 1;
  for i = j-1:-1:1
    x(i) = x(i) - u(p) * x(j);
    p = p - 1;
  end
end

其中n是原始A矩阵(正方形和SPD)的大小。从A矩阵到u的映射如下:

A(i,j) = u(i+j*(j-1)/2)

我当前正向替换算法的迭代如下:

x = b;
p = 1;

for j = 1:n
    x(j) = x(j) / u(p);
    p = p + 1;
    for i = j+1:n
        x(i) = x(i) - u(p) * x(j);
        p = p + 1;
    end
end

我似乎无法弄清楚我做错了什么。无论我尝试什么,最后只是给我NaNInf作为x的答案。任何比我聪明的人都可以找出算法的样子吗?

1 个答案:

答案 0 :(得分:0)

根据我的理解,您正试图解决导致Ax = b解决方案的两个问题。

其中A = LL'表示A等于下三角矩阵(L)乘以其转置(L'

首先通过正向替换来解决Ly = b

最后通过反向替换来解决L'x = y

你的后方替代你的u(p)被定义为(n = 3):

     | u(1) u(2) u(4) |
L' = |  0   u(3) u(5) |
     |  0    0   u(6) |

我认为你遇到前向替代的问题来自L定义为:

    | u(1)  0    0   |
L = | u(2) u(3)  0   |
    | u(4) u(5) u(6) |

你的价值p需要有以下进展才能通过前方替代完成你想要的东西:

{1, 2, 4, 3, 5, 6}

我修改了您当前的代码以进行转发,以实现此模式。

x = b;
p = 1;

for j = 1:n
    d = j-1;
    p = j + (d^2+d)/2;
    x(j) = x(j) / u(p);
    d = d + 1;
    for i = j+1:n
        p = j + (d^2+d)/2;
        x(i) = x(i) - u(p) * x(j);
        d = d + 1;
    end
end

我能够测试它,并产生预期的结果。 我希望这对你有帮助。