Mercurial > matrix-functions
annotate sqrtm2.m @ 8:a587712dcf5f draft default tip
funm_atom.m: rename fun_atom to funm_atom
* funm_atom.m: rename fun_atom to funm_atom.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Fri, 29 May 2015 09:48:36 +0200 |
parents | e0817ccb2834 |
children |
rev | line source |
---|---|
7
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
1 function [X, alpha, condest] = sqrtm2(A) |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
2 %SQRTM2 Matrix square root. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
3 % X = SQRTM2(A) is a square root of the matrix A (A = X*X). |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
4 % X is the unique square root for which every eigenvalue has |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
5 % nonnegative real part (the principal square root). |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
6 % If A is real with a negative real eigenvalue then a complex |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
7 % result will be produced. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
8 % If A is singular then A may not have a square root. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
9 % [X, ALPHA, CONDEST] = SQRTM2(A) returns a stability factor ALPHA and |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
10 % an estimate CONDEST for the matrix square root condition number of X. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
11 % The residual NORM(A-X^2,'fro')/NORM(A,'fro') is bounded by |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
12 % (n+1)*ALPHA*EPS and the Frobenius norm relative error in X is |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
13 % bounded approximately by N*ALPHA*CONDEST*EPS, where N = MAX(SIZE(A)). |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
14 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
15 % References: |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
16 % N. J. Higham, Computing real square roots of a real |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
17 % matrix, Linear Algebra and Appl., 88/89 (1987), pp. 405-430. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
18 % A. Bjorck and S. Hammarling, A Schur method for the square root of a |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
19 % matrix, Linear Algebra and Appl., 52/53 (1983), pp. 127-140. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
20 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
21 n = max(size(A)); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
22 [Q, T] = schur(A); % T is real/complex according to A. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
23 [Q, T] = rsf2csf(Q, T); % T is now complex Schur form. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
24 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
25 % Compute upper triangular square root R of T, a column at a time. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
26 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
27 nzeig = length(find(diag(T)==0)); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
28 if nzeig, warning('Matrix is singular and may not have a square root.'), end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
29 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
30 R = zeros(n); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
31 for j=1:n |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
32 R(j,j) = sqrt(T(j,j)); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
33 for i=j-1:-1:1 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
34 s = 0; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
35 for k=i+1:j-1 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
36 s = s + R(i,k)*R(k,j); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
37 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
38 if R(i,i) + R(j,j) ~= 0 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
39 R(i,j) = (T(i,j) - s)/(R(i,i) + R(j,j)); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
40 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
41 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
42 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
43 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
44 if nargout > 1, alpha = norm(R,'fro')^2 / norm(T,'fro'); end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
45 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
46 X = Q*R*Q'; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
47 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
48 if nargout > 2 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
49 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
50 if nzeig |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
51 condest = inf; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
52 else |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
53 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
54 % Power method to get condition number estimate. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
55 warns = warning; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
56 warning('off'); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
57 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
58 tol = 1e-2; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
59 x = ones(n^2,1); % Starting vector. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
60 cnt = 1; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
61 e = 1; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
62 e0 = 0; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
63 while abs(e-e0) > tol*e & cnt <= 6 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
64 x = x/norm(x); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
65 x0 = x; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
66 e0 = e; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
67 Sx = solve(R, x); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
68 x = solve(R, Sx, 'T'); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
69 e = sqrt(real(x0'*x)); % sqrt of Rayleigh quotient. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
70 fprintf('cnt = %2.0f, e = %9.4e\n', cnt, e) |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
71 cnt = cnt+1; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
72 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
73 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
74 condest = e*norm(A,'fro')/norm(X,'fro'); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
75 warning(warns); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
76 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
77 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
78 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
79 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
80 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
82 function x = solve(R, b, tran) |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
83 %SOLVE Solves Kronecker system. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
84 % x = SOLVE(R, b, TRAN) solves |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
85 % A*x = b if TRAN = '', |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
86 % A'*x = b if TRAN = 'T', |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
87 % where A = KRON(EYE,R) + KRON(TRANSPOSE(R),EYE). |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
88 % Default: TRAN = ''. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
89 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
90 if nargin < 3, tran = ''; end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
91 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
92 n = max(size(R)); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
93 x = zeros(n^2,1); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
94 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
95 I = eye(n); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
96 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
97 if isempty(tran) |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
98 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
99 % Forward substitution. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
100 for i = 1:n |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
101 temp = b(n*(i-1)+1:n*i); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
102 for j = 1:i-1 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
103 temp = temp - R(j,i)*x(n*(j-1)+1:n*j); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
104 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
105 x(n*(i-1)+1:n*i) = (R + R(i,i)*I) \ temp; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
106 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
107 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
108 elseif strcmp(tran,'T') |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
109 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
110 % Back substitution. |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
111 for i = n:-1:1 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
112 temp = b(n*(i-1)+1:n*i); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
113 for j = i+1:n |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
114 temp = temp - conj(R(i,j))*x(n*(j-1)+1:n*j); |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
115 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
116 x(n*(i-1)+1:n*i) = (R' + conj(R(i,i))*I) \ temp; |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
117 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
118 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
119 end |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
120 |
e0817ccb2834
Add square root matrix function file, rename atom at funm_files, modify old toolbox to run it inside GNU Octave.
Antonio Pino Robles <data.script93@gmail.com>
parents:
diff
changeset
|
121 return |