In [17]:
import numpy as np
x = np.array([ 4., 4., 0, 0, ], dtype=float)
np.outer(x,x)
Out[17]:
In [15]:
def multi_rankupdate(R,x):
p = np.size(x)
x = x.T
k=0
for k in range(p):
r = np.sqrt(R[k,k]**2 + x[k]**2)
c = r/R[k,k]
s = x[k]/R[k,k]
R[k,k] = r
R[k,k+1:p] = (R[k,k+1:p] + s*x[k+1:p])/c
x[k+1:p]= c*x[k+1:p] - s*R[k, k+1:p]
for k in range(1,p):
r = R[k,k]
c = 1.0
s = 0.
x[k+1:p] = x[k+1:p]
return R
In [58]:
def cholupdate(R,x):
p = int(np.size(x))
for k in range(p):
r = np.sqrt(R[k,k]**2 + x[k]**2)
c = r/R[k,k]
s = x[k]/R[k,k]
R[k,k] = r
R[k,k+1:p] = (R[k,k+1:p] + s*x[k+1:p])/c
x[k+1:p]= c*x[k+1:p] - s*R[k, k+1:p]
return R
In [2]:
from sklearn.datasets import make_spd_matrix
A = make_spd_matrix(6,4)
A
Out[2]:
In [118]:
L = np.linalg.cholesky(A)
np.dot(L, L.T.conj()) # verify that L * L.H = A
Out[118]:
In [132]:
beta = np.array([ 1.0, 0, 0, 0 ])
# beta = np.array([ 1.0, 1.0, 1.0, 1.0 ])
A_b = A + np.outer(beta,beta.T)
A_b
Out[132]:
In [145]:
#function [L] = cholupdate(L, x)
# n = length(x);
# for k = 1:n
# r = sqrt(L(k, k)^2 + x(k)^2);
# c = r / L(k, k);
# s = x(k) / L(k, k);
# L(k, k) = r;
# L(k+1:n, k) = (L(k+1:n, k) + s * x(k+1:n)) / c;
# x(k+1:n) = c * x(k+1:n) - s * L(k+1:n, k);
# end
#end
def cholupdate(Rin,xin):
R = Rin.copy()
x = xin.copy()
p = int(np.size(x))
for k in range(p):
r = np.sqrt(R[k,k]**2 + x[k]**2)
c = r/R[k,k]
s = x[k]/R[k,k]
R[k,k] = r
R[k,k+1:p] = (R[k,k+1:p] + s*x[k+1:p])/c
x[k+1:p] = c*x[k+1:p] - s*R[k, k+1:p]
return R
def cholupdate_allzerosbutone(Rin,xin):
R = Rin.copy()
x = xin.copy()
p = int(np.size(x))
k = 0
r = np.sqrt(R[k,k]**2 + x[k]**2)
c = r/R[k,k]
s = x[k]/R[k,k]
R[k,k] = r
R[k,k+1:p] = (R[k,k+1:p] + s*x[k+1:p])/c
x[k+1:p] = - s*R[k, k+1:p]
for k in range(1,p):
print(x[k])
r = np.sqrt(R[k,k]**2 + x[k]**2)
c = r/R[k,k]
s = x[k]/R[k,k]
R[k,k] = r
R[k,k+1:p] = (R[k,k+1:p] + s*x[k+1:p])/c
x[k+1:p] = c*x[k+1:p] - s*R[k, k+1:p]
return R
L_b = cholupdate_allzerosbutone(L.T, beta).T
np.linalg.norm(np.dot(L_b, L_b.T.conj()) - A_b) # verify that L * L.H = A
# L, L_b
Out[145]:
In [125]:
L_b = np.linalg.cholesky(A_b)
L_b
Out[125]:
In [ ]: