想起學過三個月的線性代數,
一開始覺得很沒用,
後來找文獻的時候發現其實還蠻有用的,
線性代數我目前用到比較實際的只有2個

1.解聯立方程組
2.求行列式值(det)

求解聯立方程組,用高斯消去法還算簡單
不過 det 的若是高維度,還真的讓人心煩
最後用 recursive 方式解決了

這部份,我寫好的函數很多,
這篇文章只先列出行列式的基本"列"運算
(注意,我只寫列運算,沒寫行運算,有用到行運算的請再自行寫)

由於函數繁多,如果函數寫法、用法有問題的話
歡迎回覆討論

函數說明:
1.MMAXVALUE  矩陣中之最大值
2.MMINVALUE   矩陣中之最小值
3.Rij     第 i 列與第 j 列互換
4.Rijx    第 i 列乘以 x 加到第 j 列
5.Rix     第 i 列乘以 x
6.IsRi0  判斷第 i 列是否全為 0
7.IsUnitMatrix   判斷是否為單位矩陣
8.IsZeroMatrix  判斷是否為零矩陣
9.CopyMatrix    複製矩陣

// =======================================
// author  : edison.shih.
// filename: matrix.h
// date    : 2010/2/7
// mail    : forget72@hotmail.com
// ** all copyright reverve **
// =======================================

#ifndef __MATRIX
#define __MATRIX

// =================================
// 矩陣基本運算

// 矩陣中之最大值
double MMAXVALUE(double **a,
     unsigned m,
     unsigned n);


// 矩陣中之最小值
double MMINVALUE(double **a,
     unsigned m,
     unsigned n);

// 列交換
void Rij(double **a,
   unsigned row1,
   unsigned row2,
   unsigned dim);

// row2列 = row1 列 * x + row2
void Rijx(double **a,
    unsigned row1,
    unsigned row2,
    double x,
    unsigned dim);

// row * x
void Rix(double **a,
   unsigned row,
   double x,
   unsigned dim);

// 判斷 row 列是否全0
bool IsRi0(double **a,
     unsigned row,
     unsigned dim);

// 判斷是否為單位矩陣
bool IsUnitMatrix(double **a,
      unsigned dim);

// 判斷是否為零矩陣
bool IsZeroMatrix(double **a,
      unsigned dim);

// 設成單位矩陣
void SetUnitMatrix(double **a,
       unsigned dim);

// 設為零矩陣
void SetZeroMatrix(double **a,
       unsigned dim);

// 複製矩陣
void CopyMatrix(double **_des,
    double **_src,
    unsigned m,
    unsigned n);

#endif

// =======================================
// author  : edison.shih.
// filename: matrix.cpp
// date    : 2010/2/7
// mail    : forget72@hotmail.com
// ** all copyright reverve **
// =======================================

#include "matrix.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//////////////////////////////////////////////////////////////
// 矩陣基本運算

// ==============================
// 矩陣中之最大值
double MMAXVALUE(double **a,
                 unsigned m,
                 unsigned n)
{
    double max = a[0][0];
    for(unsigned i=0; i<m; i++){
        for(unsigned j=0; j<n; j++) {
            if(a[i][j] > max) max = a[i][j];
        }
    }
    return max;
}

// ==============================
// 矩陣中之最小值
double MMINVALUE(double **a,
                 unsigned m,
                 unsigned n)
{
    double min = a[0][0];
    for(unsigned i=0; i<m; i++){
        for(unsigned j=0; j<n; j++) {
            if(a[i][j] < min)min  = a[i][j];
        }
    }
    return min;
}

// ==============================
// 列交換
void Rij(double **a,
         unsigned row1,
         unsigned row2,
         unsigned dim)
{
    double temp=0.0;
    for(unsigned i=0; i<dim; i++){       
        temp = a[row1][i];
        a[row1][i] = a[row2][i];
        a[row2][i] = temp;
    }
}

// ==============================
// row2列 = row1 列 * x + row2
void Rijx(double **a,
          unsigned row1,
          unsigned row2,
          double x,
          unsigned dim)
{
    for(unsigned i=0; i<dim; i++) {
        a[row2][i] += a[row1][i]*x;
    }
}


// ==============================
// row * x
void Rix(double **a,
         unsigned row,
         double x,
         unsigned dim)
{
    for(unsigned i=0; i<dim; i++){
        a[row][i] *= x;
    }
}

// ==============================
// 判斷某列是否全0
bool IsRi0(double **a,
           unsigned row,
           unsigned dim)
{
    for(unsigned i=0; i<dim; i++){
        if(a[row][i]!=0) return false;
    }
    return true;
}

// ==============================
// 判斷是否為單位矩陣
bool IsUnitMatrix(double **a,
                  unsigned dim)
{
    for(unsigned i=0; i<dim; i++){
        for(unsigned j=0; j<dim; j++){
            if(i==j) {
                if(a[i][j]!=1.0) return false;
            }
            else {
                if(a[i][i]!=0.0) return false;
            }
        }
    }
    return true;
}

// ==============================
// 複製矩陣
void CopyMatrix(double **_des,
                double **_src,
                unsigned m,
                unsigned n)
{
    for(unsigned i=0; i<m; i++){
        for(unsigned j=0; j<n; j++){
            _des[i][j] = _src[i][j];
        }
    }
}

// ==============================
// 判斷是否為零矩陣
bool IsZeroMatrix(double **a,
                  unsigned dim)
{
    for(unsigned i=0; i<dim; i++){
        for(unsigned j=0; j<dim; j++){
            if(a[i][j]!=0) return false;
        }
    }
    return true;
}

// ==============================
// 設成單位矩陣
void SetUnitMatrix(double **a,
                   unsigned dim)
{
    for(unsigned i=0; i<dim; i++){
        for(unsigned j=0; j<dim; j++){
            if(i==j) a[i][j] = 1.0;
            else a[i][j] = 0.0;
        }
    }
}

// ==============================
// 設為零矩陣
void SetZeroMatrix(double **a,
                   unsigned dim)
{
    for(unsigned i=0; i<dim; i++){
        for(unsigned j=0; j<dim; j++){
            a[i][j] = 0.0;
        }
    }
}

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(1) 人氣()