matrixbase::SetDiagonal

Description

Set the diagonal or N-th diagonal of this matrix.

Syntax

int SetDiagonal( vectorbase & vbDiagonal, int nNthDiagonal = 0 )

Parameters

vbDiagonal
[input] The source vector containing the (N-th) diagonal
nNthDiagonal
[input] The number specifying the N-th diagonal, default 0 is the main diagonal, > 0 is above the main diagonal, and < 0 is below the main diagonal.

Return

Returns 0 on success or a non-zero error code on failure.

Examples

EX1

// Set a vector to the diagonal of a matrix
void matrixbase_SetDiagonal_ex1()
{
    int rc, ii,jj;
    
    matrix<double> mat1 = {
        { 2,  1, 99,  1,  1},
        { 1, 99,  1,  1,  1},
        {99,  1,  2,  1,  1}
    };
    
    for(ii=0; ii<3; ii++)
        for(jj=0; jj<5; jj++)
            if(mat1[ii][jj]==99)
                mat1[ii][jj]=NANUM;  // set row=ii,col=jj to NANUM
//  Input matrix is:
//        { 2,  1, --,  1,  1}
//        { 1, --,  1,  1,  1}
//        {--,  1,  2,  1,  1}

    vector vec1 = {1, 1, 1};  //Vector for the diagonal of the output matrix
    
//   Output matrix with all 1s at the diagonal:
//        {1,  0,  0}
//        {0,  1,  0}
//        {0,  0,  1}


    MatrixPage MatPg1;
    MatPg1.Create("Origin");
    MatrixLayer MatLy1 = MatPg1.Layers(0);
    Matrix Mat1(MatLy1);
    Mat1 = mat1;
    printf("  Input matrix is %s.\n",Mat1.GetName());
    
    MatrixPage MatPg2;
    MatPg2.Create("Origin");
    MatrixLayer MatLy2 = MatPg2.Layers(0);
    Matrix Mat2(MatLy2);
    Mat2=mat1;
    
    rc=Mat2.SetDiagonal(vec1); //Put 1s into the diagonal of Mat2
    if(rc!=0) 
        printf("  Error: SetDiagonal failed. Error Code=%d\n",rc);
    else {
        printf("  Output matrix with 1s at the diagonal is %s.\n",Mat2.GetName());
        printf("  Note that the output matrix is a square matrix.\n");
        printf("  Note that all cells in the non-diagonal area became 0s.\n");
    }
}

Remark

Set the diagonal or N-th diagonal of this matrix from a vector and set all other elements to 0. The source vector and this matrix must have the same underlying base type or a run time error will be generated.

See Also

matrixbase::GetDiagonal, matrixbase::GetLowerTriangular, matrixbase::GetUpperTriangular, matrixbase::MakeIdentity

Header to Include

origin.h