Cholesky Decomposition Column-Wise Algorithm Implementation
显示 更早的评论
Hello I am trying to implement the following algorithm for Cholesky Decomposition Column-Wise Method:
for j=1:n
for i=1:j-1
end
end
My attempt so far at implementing the above:
A=[4 -1 1;
-1 4.25 2.75;
1 2.75 16;];
% Check R matches with col(A);
count = 0;
[n,n] = size(A);
R=zeros(n,n)
for j=1:n
for i=1:j-1
sum1 = 0
for k=1:i-1
sum1 = sum1 + R(k,i)*R(k,j);
end
R(i,j)=(A(i,j)-sum1)/R(i,i);
end
sum2 = 0;
for k=1:j-1
sum2 = sum2 + R(k,j)*R(k,j);
end
R(j,j)=sqrt(A(j,j)-sum2);
end
Q=transpose(R);
S=Q*R;
EDIT: I have modified the code and it runs properly, many thanks to the helpful feedback I received.
3 个评论
Fabio Freschi
2019-9-25
When j = 1, you have to evaluate R(1:j-1,j) but the indexing of rows is 1:0 that is
1×0 empty double row vector
Note also that your A matrix is not SPD, so Cholesky cannot be applied
J
2019-9-25
David Goodmanson
2019-9-25
I takes more than a positive determinant for a symmetric matrix to be positive definite. It also has to have all positive eigenvalues. However,
A = [4 -1 1;
-1 4.25 2.75;
1 2.75 16;];
eig(A)
ans =
2.5946
4.9978
16.6577
so it qualifies.
采纳的回答
更多回答(2 个)
Steven Lord
2019-9-25
0 个投票
The algorithm you've been given performs a summation twice, once inside both loops and once inside just the outermost loop. Your code does not include the sum function and does not include loops over k.
As a first pass, I recommend writing your code as closely to the algorithm given in your homework / class notes / textbook. [If you're trying to compute the Cholesky decomposition and it's not part of school work, I strongly recommend simply calling chol instead of building your own.] Once you have that working, then you could start modifying it to reduce the number of loops, vectorize some operations, etc.
3 个评论
Steven Lord
2019-9-25
Your modified code is overwriting R(i, j) every iteration through the two loops over k. Before you enter the first for loop over k, make a temporary value to store the sum. Inside the for loop over k, add R(k, i)*R(k, j) to your temporary value. After the for loop is finished, then update R(i, j) using the sum stored in the temporary value.
Use that same technique for the second loop as well.
J
2019-9-29
Imane AITSITAHAR
2022-4-8
0 个投票
A=[4 -1 1;
-1 4.25 2.75;
1 2.75 16;];
% Check R matches with col(A);
count = 0;
[n,n] = size(A);
R=zeros(n,n)
for j=1:n
for i=1:j-1
sum1 = 0
for k=1:i-1
sum1 = sum1 + R(k,i)*R(k,j);
end
R(i,j)=(A(i,j)-sum1)/R(i,i);
end
sum2 = 0;
for k=1:j-1
sum2 = sum2 + R(k,j)*R(k,j);
end
R(j,j)=sqrt(A(j,j)-sum2);
end
Q=transpose(R);
S=Q*R;
类别
在 帮助中心 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!