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