Tuesday, October 18, 2011

The Minor of a Matrix in NMat

In order to understand this article, you should read the following articles first:

The function takes as parameters a pointer to the original matrix, the row and column who will be eliminated and the order of the minor. Since the minor will be a square matrix as well, the order represents the number of columns/rows of the minor matrix.
Minor examples
The function's definition is:
/*
 * Description:
 *  Computes the minor of a given matrix according to
 * a predefined @row, @column and @order.
 * Parameters:
 *  mat1 - a pointer to the matrix
 *  row - the starting row
 *  column - the starting column
 *  order - the size of the minor
 * Returns:
 *  A pointer to the minor matrix if the conditions are valid.
 * Otherwise returns NULL.
 * Preconditions:
 *  @mat must not be NULL
 *  @may must be a square matrix
 *  @column and @row must be smaller than @order
 *  @order must be greater than 1 but smaller than
 *  the size of the matrix
 */
NMatrix* NMatrix_Minor(const NMatrix *mat,
         integer row, integer column,
         integer order);
The implementation of the function is:
NMatrix* NMatrix_Minor(const NMatrix *mat, integer row,
                       integer column, integer order)
{
   integer i=0, j=0;
   integer rowCount = 0, colCount = 0;
   NMatrix *minor = NULL;

   if((mat->rows==mat->columns) && ((row-1)<order) && ((column-1)< order) &&
    (order>=1) && (order<mat->rows) )
    {
      if(order==1)
      {
         minor = NMatrix_Create(1,1);
         minor->data[0][0] = mat->data[row][column];
      }
      else
      {
         minor = NMatrix_Create(order, order);
         for(i=0; i<=order; i++)
         {
            if(i!=row)
            {
               colCount = 0;
               for(j=0;j<=order;j++)
               {
                  if(j!=column)
                  {
                     minor->data[rowCount][colCount] = mat->data[i][j];
                     colCount++;
                  }
               }
               rowCount++;
            }
         }
       }
   }
   return minor;
}
Here's an example on how to use the function:
#include<stdio.h>
#include"NMatrix.h"

void PrintMatrix(NMatrix *mat)
{
   integer i = 0, j = 0;
   for (i = 0; i < mat->rows; i++)
   {
      for (j = 0; j < mat->columns; j++)
      {
         printf("%f ", mat->data[i][j]);
      }
      putchar('\n');
   }
   putchar('\n');
}

int main(int argc, char *argv[])
{
   integer i = 0, j = 0;
   NMatrix *mat = NULL;
   NMatrix *minor = NULL;
   /*Creating the matrix*/
   mat = NMatrix_Create(5, 5);
   /*Assigning values to the matrix*/
   for (i = 0; i < 5; i++)
   {
      for (j = 0; j < 5; j++)
      {
         mat->data[i][j] = (real) (i + j);
      }
   }
   /*Computing the minor*/
   minor = NMatrix_Minor(mat, 1, 1, 3);
   /*Printing the matrices*/
   puts("Original matrix: ");
   PrintMatrix(mat);
   puts("Minor: ");
   PrintMatrix(minor);
   return 0;
}
/*:
Original matrix:
0.000000 1.000000 2.000000 3.000000 4.000000
1.000000 2.000000 3.000000 4.000000 5.000000
2.000000 3.000000 4.000000 5.000000 6.000000
3.000000 4.000000 5.000000 6.000000 7.000000
4.000000 5.000000 6.000000 7.000000 8.000000

Minor:
0.000000 2.000000 3.000000
2.000000 4.000000 5.000000
3.000000 5.000000 6.000000
 */

No comments:

Post a Comment

Got a question regarding something in the article? Leave me a comment and I will get back at you as soon as I can!

Related Posts Plugin for WordPress, Blogger...
Recommended Post Slide Out For Blogger