예제 #1
0
int main(int, char**)
{
    using namespace std;
    using mtl::lazy; using mtl::io::tout;
    typedef mtl::dense_vector<double> vt;
    
    vt v(60);
    iota(v);
    tout << "v is " << v << endl;

    mtl::mat::identity2D I(60);
    vt w1(I * v);
    tout << "I * v is " << w1 << endl;

    if (one_norm(vt(w1 - v)) > 0.001) throw "Wrong result with square identity";

    w1-= I * v;
    tout << "w1-= I * v is " << w1 << endl;
    if (one_norm(w1) > 0.001) throw "Wrong result";

    w1+= I * v;
    tout << "w1+= I * v is " << w1 << endl;
    if (one_norm(vt(w1 - v)) > 0.001) throw "Wrong result with square identity"; 

    vt w2( w1 - I * v );
    double alpha;
    (lazy(w2)= I * v) || (lazy(alpha)= lazy_dot(w2, v));

    vt w3(30), w4(90);
    mtl::mat::identity2D I3(30, 60), I4(90, 60);
    
    w3= I3 * v;
    tout << "I3 * v is " << w3 << endl;
    if (one_norm(vt(w3 - v[mtl::irange(30)])) > 0.001) throw "Wrong result with broad identity";
    
    w4= I4 * v;
    tout << "I4 * v is " << w4 << endl;
    if (one_norm(vt(w4[mtl::irange(60)] - v)) > 0.001) throw "Wrong result with long identity";
    if (one_norm(w4[mtl::irange(60, 90)]) > 0.001) throw "Wrong result with long identity";

#if 0
    mtl::dense2D<double> A(60,60);
    A=2;
    A+= A*I;
    std::cout<< "A=\n" << A << "\n";
#endif
    return 0;
}
예제 #2
0
int main(int, char**)
{
    using namespace std;
    using mtl::lazy;
    using mtl::io::tout;
    typedef mtl::vector::dense_vector<double> vt;

    mtl::compressed2D<double> A0;
    laplacian_setup(A0, 4, 15);
    tout << "A0 is\n" << A0 << endl;

    vt v(60);
    iota(v);
    tout << "v is " << v << endl;

    vt w1(A0 * v);
    tout << "A0 * v is " << w1 << endl;

    mtl::matrix::poisson2D_dirichlet A(4, 15);
    vt  w2(60);
    w2= A * v;
    tout << "A * v is " << w2 << endl;

    if (one_norm(vt(w1 - w2)) > 0.001) throw "Wrong result";

    w2+= A * v;
    tout << "w2+= A * v is " << w2 << endl;
    if (one_norm(vt(w1 + w1 - w2)) > 0.001) throw "Wrong result";

    w2-= A * v;
    tout << "w2-= A * v is " << w2 << endl;
    if (one_norm(vt(w1 - w2)) > 0.001) throw "Wrong result";

    vt w3( w2 - A * v );
    double alpha;
    (lazy(w3)= A * v) || (lazy(alpha)= lazy_dot(w3, v));

    return 0;
}