Skip to content

Commit 4c964d3

Browse files
committed
eigvecs(::Bidiagonal) speedup
1 parent e5c8309 commit 4c964d3

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

base/linalg/bidiag.jl

+11-4
Original file line numberDiff line numberDiff line change
@@ -559,23 +559,30 @@ function eigvecs{T}(M::Bidiagonal{T})
559559
n = length(M.dv)
560560
Q = Array{T}(n, n)
561561
blks = [0; find(x -> x == 0, M.ev); n]
562+
v = zeros(T, n)
562563
if M.isupper
563564
for idx_block = 1:length(blks) - 1, i = blks[idx_block] + 1:blks[idx_block + 1] #index of eigenvector
564-
v=zeros(T, n)
565+
fill!(v, zero(T))
565566
v[blks[idx_block] + 1] = one(T)
566567
for j = blks[idx_block] + 1:i - 1 #Starting from j=i, eigenvector elements will be 0
567568
v[j+1] = (M.dv[i] - M.dv[j])/M.ev[j] * v[j]
568569
end
569-
Q[:, i] = v/norm(v)
570+
c = norm(v)
571+
for j = 1:n
572+
Q[j, i] = v[j] / c
573+
end
570574
end
571575
else
572576
for idx_block = 1:length(blks) - 1, i = blks[idx_block + 1]:-1:blks[idx_block] + 1 #index of eigenvector
573-
v = zeros(T, n)
577+
fill!(v, zero(T))
574578
v[blks[idx_block+1]] = one(T)
575579
for j = (blks[idx_block+1] - 1):-1:max(1, (i - 1)) #Starting from j=i, eigenvector elements will be 0
576580
v[j] = (M.dv[i] - M.dv[j+1])/M.ev[j] * v[j+1]
577581
end
578-
Q[:,i] = v/norm(v)
582+
c = norm(v)
583+
for j = 1:n
584+
Q[j, i] = v[j] / c
585+
end
579586
end
580587
end
581588
Q #Actually Triangular

0 commit comments

Comments
 (0)