33 lines
934 B
Matlab
Executable File
33 lines
934 B
Matlab
Executable File
% function [L, D] = ld(X)
|
|
% % LD factorization produces LDL'=X*X' which is the same as [L,D] = ldl(X*X');
|
|
% % the underlying algorithm is Gram-Schmidt orthogonalization
|
|
% [d,n] = size(X);
|
|
% m = min(d,n);
|
|
% L = eye(d,m);
|
|
% Q = zeros(m,n);
|
|
% D = zeros(m,1);
|
|
% for i = 1:m
|
|
% L(i,1:i-1) = X(i,:)*bsxfun(@times,Q(1:i-1,:),1./D(1:i-1))';
|
|
% Q(i,:) = X(i,:)-L(i,1:i-1)*Q(1:i-1,:);
|
|
% D(i) = dot(Q(i,:),Q(i,:));
|
|
% end
|
|
% L(m+1:d,:) = X(m+1:d,:)*bsxfun(@times,Q,1./D)';
|
|
|
|
function [L, D] = ld(X)
|
|
% LD factorization produces LDL'=X*X' which is the same as [L,D] = ldl(X*X');
|
|
% the underlying algorithm is modified Gram-Schmidt orthogonalization
|
|
[d,n] = size(X);
|
|
m = min(d,n);
|
|
L = eye(d,m);
|
|
Q = zeros(m,n);
|
|
D = zeros(m,1);
|
|
for i = 1:m
|
|
v = X(i,:);
|
|
for j = 1:i-1
|
|
L(i,j) = v*Q(j,:)'/D(j);
|
|
v = v-L(i,j)*Q(j,:);
|
|
end
|
|
Q(i,:) = v;
|
|
D(i) = dot(Q(i,:),Q(i,:));
|
|
end
|
|
L(m+1:d,:) = X(m+1:d,:)*bsxfun(@times,Q,1./D)'; |