想起學過三個月的線性代數,
一開始覺得很沒用,
後來找文獻的時候發現其實還蠻有用的,
線性代數我目前用到比較實際的只有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;
}
}
}