sparse_rand = function( order; density ) {
# This function returns a random positive-definite matrix with
# `order' rows and columns and approximately `density*order^2'
# non-zero elements.
local( i; v; m );
v = fill( density*order^2; r*order+0.5 );
m = 10 * diag( fill( order; r ) );
for ( i in 1:v.ne ) {
m[ v[i]; v[v.ne+1-i] ] = r[ i%r.ne+1 ];
}
return sparse( symmetric( m' * m ) );
};
ssi = function( A; n ) {
# This function uses subspace iteration to compute the first
# `n' eigenvalues and eigenvectors of `A'.
local ( V; B; lambda; tmp; Afac; Vb; e; d; i; r );
V = A[;1:n];
B = diag( fill( A.nr; 1 ) );
lambda = diag( transform(A;V) ) / diag( transform(B;V) );
Afac = chol( A );
while ( 1 ) {
Vb = solve( Afac; V );
e = eig( transform(A;Vb); transform(B;Vb) );
d = e.values;
tmp = abs( lambda - d )/ d;
r = tmp[ imax( tmp ) ];
lambda = e.values;
V = Vb*e.vectors;
if ( r < 1.0e-6 ) { break; };
}
return { values=e.values; vectors=V };
};
r = (
0.22416506718106805,
0.26479003963283732,
0.76919488830920069,
0.90072274622541049,
0.089192990720827592,
0.36610337829501527,
0.27111135249543533,
0.69340546694277105,
0.32150303959916487,
0.020990991509049661,
0.60930041997195239,
0.39150595217547657,
0.049584821820997084,
0.36070557793635205,
0.047469744480899419,
0.27127325594018831,
0.3585841797099375,
0.30496160001725031,
0.63219573238501126,
0.024773588881256799,
0.065283286881299363,
0.39865082194965834,
0.83662774266518081,
0.998176271560684,
0.53930278194104453,
0.90322313360088646,
0.63726972259453951,
0.050166096561665693,
0.87081706378181323,
0.039887622483022335,
0.32569793394100754,
0.094982130497220027,
0.30467766211585962,
0.094892822250208272,
0.99570487718829181,
0.39387065330234855,
0.4609962005452235,
0.26681622921806586,
0.08727611977945833,
0.78249924014438843,
0.28780722072711551,
0.69657653975141076,
0.17400519185420368,
0.33739204254811261,
0.057282117222101483,
0.2214749363351031,
0.60866529895396215,
0.41586629739770026,
0.52643653635235343,
0.24086103087331218,
0.44063988627895706,
0.5917198232336528,
0.63951185282297052,
0.27726762894413787,
0.58989609432867551,
0.17881463429835376,
0.18049076207936313,
0.22716581692321497,
0.22898073132568073,
0.051307825395515108,
0.26705343940623733,
0.5546786652666883,
0.14628995635839642,
0.57173110198775823,
0.64957148751689653,
0.14199483308102695,
0.96560175529010672,
0.1105676875964588,
0.40881106229909281,
0.052877874603903793,
0.89306692820650846,
0.69661828349186961,
0.74945441482097586,
0.067072119595050869,
0.03401032557432089,
0.80673653204307727,
0.28854705639581524,
0.64267562452828308,
0.2226028289751163,
0.81498359274816867,
0.88353665540159521,
0.6632427157197347,
0.40670341598182147,
0.52304850822456572,
0.94051034466387251,
0.99659951031049687,
0.70186314252291948,
0.12100110627757436,
0.22376532676805058,
0.93084387384860023,
0.17230893213875076,
0.49081876663994917,
0.48552253911528853,
0.31859888849714718,
0.062549868162046121,
0.13509402616652383,
0.46059372157817413,
0.028151622986491594,
0.24566171422864391,
0.86940478387726694
);
ssi( sparse_rand( 660; 0.01 ); 66 );
syntax highlighted by Code2HTML, v. 0.9.1