Mercurial > matrix-functions
diff mftoolbox/cosmsinm.m @ 0:8f23314345f4 draft
Create local repository for matrix toolboxes. Step #0 done.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Wed, 06 May 2015 14:56:53 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mftoolbox/cosmsinm.m Wed May 06 14:56:53 2015 +0200 @@ -0,0 +1,46 @@ +function [C,S,cost,s] = cosmsinm(A) +%COSMSINM Matrix cosine and sine by double angle algorithm. +% [C,S,COST,s] = COSMSINM(A) computes the cosine C and the sine S +% of the matrix A using the double angle algorithm with Pade +% approximation. The total number of matrix multiplications and +% linear systems solved is returned as COST and s specifies the +% amount of scaling (A is scaled to 2^(-s)*A). + +n = length(A); +theta = [0.00613443965526 0.11110098037055 0.43324697422211 0.98367255274344 ... + 1.72463663220280 2.61357494421368 3.61521023400301 4.70271938553349 ... + 5.85623410320942 7.06109053959248 0 9.58399601173102]; + +normA = norm(A,inf); +d = [2 4 6 8 10 12 14 16 20]; +for i = d(1:8) + if normA <= theta(i/2); + m = i; + cost = m/2+3; + [C,S] = cosmsinm_pade(A,m); + s = m; + return + end +end + +s = 0; +if normA > theta(20/2) + s = max( ceil( log2( normA/theta(20/2) ) ), 1 ); + A = A/(2^s); + normA = normA/(2^s); +end + +if normA > 2*theta(12/2) + m = 20; cost = 12; +elseif normA > theta(16/2) + A = A/2; m = 12; cost = 9; s = s+1; +else + m = 16; cost = 11; +end + +[C,S] = cosmsinm_pade(A,m); +for i = 1:s + S = 2*S*C; + C = 2*(C^2) - eye(n); +end +cost = cost + 2*s;