矩阵的知识点之多足以写成一本线性代数。

在C++中,我们把矩阵封装成类。。

程序清单:

Matrix.h//未完待续

#ifndef _MATRIX_H
#define _MATRIX_H #include<iostream>
#include<vector>
using namespace std; template <typename T>
class Matrix
{
public://矩阵基本运算
Matrix operator*(const Matrix<T> &matrix); //运算符重载“*”重载为点乘
Matrix operator+(const Matrix<T> &matrix); //运算符重载“+”为矩阵加法
Matrix operator-(const Matrix<T> &matrix); //运算符重载“-”为矩阵减法
Matrix operator|(const Matrix<T> &matrix); //重载运算符“|”为为矩阵增广(把b矩阵并在a矩阵后面)
Matrix operator*(const double input); //重载运算符“*”常数乘法
Matrix operator*(const float input); //同上
Matrix operator*(const int input); //同上 double determinant(); //求矩阵行列式的值
double det_recursion(Matrix<T> &matrix); //求矩阵行列式的值 递归
Matrix<T> getAlgebraicCofactor(int row,int column); //获取代数余子式
bool calAdjugateMatrix(Matrix<double> *matrix); //求伴随矩阵
Matrix transpose(); //获取矩阵的转置
Matrix reduceAnIdentity(int number); //产生一个秩为number的单位矩阵
bool GaussianElimination(); //高斯消元
bool rref(); //化简矩阵(reduced row echelon form)行最简式
bool rrefmovie(); //化简矩阵(reduced row echelon form)行最简式,并打印过程
bool inverse(); //矩阵的逆
bool clear(); //清空矩阵
public://矩阵增删补改
Matrix();
Matrix(int rows,int columns); //产生一个行数为rows,列数为columnns的矩阵
virtual ~Matrix();
int getRows()const; //获取行数
int getColumns()const; //获取列数
bool getSpecifiedElem(int row,int column, T *elem)const; //获取第i行第j个元素
bool getSpecifiedRow(int index,vector<T> *vec)const; //获取第index行元素
bool getSpecifiedColumn(int index,vector<T> *vec)const; //获取第index列元素
bool setSpecifiedElem(int row,int column,T value); //设置第row行第column个元素的值为value
bool addOneRowToBack(vector<T> &vec); //往最底插入一行
bool addOneColumToBack(vector<T> &vec); //往最后插入一列
bool exchangeRows(int index1st,int index2nd); //交换矩阵的两行
bool relevantCheck(vector<T> &vecA,vector<T> &vecB); //两个向量的相关性检查
bool invertibleCheck(); //可逆性检查
void printfAll(); //打印所有元素
private:
int m_iRows;
int m_iColumns;
vector<vector<T>> m_vecMatrix;
}; template <typename T>
Matrix<T>::Matrix()
{
m_iRows = ;
m_iColumns =;
m_vecMatrix.clear();
} template <typename T>
Matrix<T>::Matrix(int rows,int columns)
{
vector<T> tempVec; m_iRows = ;
m_iColumns =;
m_vecMatrix.clear(); //reduce a vector for adding
for(int i=;i<columns;i++)
{
tempVec.push_back();
} //puduce a zero matirx
for(int i=;i<rows;i++)
{
addOneRowToBack(tempVec);
}
} template <typename T>
Matrix<T>::~Matrix()
{
m_vecMatrix.clear();
} template <typename T>
int Matrix<T>::getRows()const
{
return m_iRows;
} template <typename T>
int Matrix<T>::getColumns()const
{
return m_iColumns;
} template <typename T>
bool Matrix<T>::getSpecifiedElem(int row,int column, T *elem)const
{
if(row>=m_iRows || column>=m_iColumns)
{
return false;
} *elem = this->m_vecMatrix[row][column];
return true;
} template <typename T>
bool Matrix<T>::getSpecifiedRow(int index,vector<T> *vec)const
{
if(index > m_iRows)
{
return false;
} vec->clear();
for(int i=;i<m_iColumns;i++)
{
vec->push_back(m_vecMatrix[index][i]);
} return true;
} template <typename T>
bool Matrix<T>::getSpecifiedColumn(int index,vector<T> *vec)const//获取第index列元素
{
if(index > m_iColumns)
{
return false;
} vec->clear();
for(int i=;i<m_iRows;i++)
{
vec->push_back(m_vecMatrix[i][index]);
} return true;
} template <typename T>
bool Matrix<T>::setSpecifiedElem(int row,int column,T value) //设置第row行第column个元素的值为value
{
if(row > m_iRows- ||column > m_iColumns-)
{
return false;
} m_vecMatrix[row][column]=value;
return true;
} template <typename T>
bool Matrix<T>::addOneRowToBack(vector<T> &vec)
{
/*Matrix has had datas*/
if(m_iColumns !=)
{
if(vec.size() != m_iColumns)//input data columns not equal matrix columns
{
cout<<"addOneRowToBack(): columns not equal"<<endl;
return false ;
}
} /*Adding vec to m_vecDatas*/
m_vecMatrix.push_back(vec);
m_iRows ++;
m_iColumns = vec.size();
return true;
} template <typename T>
bool Matrix<T>::addOneColumToBack(vector<T> &vec)
{
/*Matrix has had datas*/
if(m_iRows !=)
{
if(vec.size() != m_iRows)//input data columns not equal matrix columns
{
cout<<"addOneColumsToBack(): rows not equal"<<endl;
return false ;
}
}
else
{
vector<T> tempVec;
m_iRows = vec.size();
for(int i=;i<m_iRows;i++)
{
m_vecMatrix.push_back(tempVec);
}
} /*Adding vec to m_vecDatas*/
for(int i=;i<m_iRows;i++)
{
m_vecMatrix[i].push_back(vec[i]);
}
m_iColumns ++;
m_iRows = vec.size();
return true;
} template <typename T>
bool Matrix<T>::exchangeRows(int index1st,int index2nd)
{
/*input leagality check*/
if(index1st >= m_iRows || index2nd >= m_iRows)
{
cout<<"exchangeRows():index illeagel";
return false;
} /*Exchange*/
Matrix<T> outputMatrix = *this;
vector<T> tempVec = outputMatrix.m_vecMatrix[index1st];
outputMatrix.m_vecMatrix[index1st] = outputMatrix.m_vecMatrix[index2nd];
outputMatrix.m_vecMatrix[index2nd] = tempVec;
*this = outputMatrix;
return true;
} template <typename T>
Matrix<T> Matrix<T>::reduceAnIdentity(int number)
{
Matrix<T> outputMatrix(number,number); if(number <= )
{
return outputMatrix;
} //change matrixdata[i][i] to 1
for(int i=;i<number;i++)
{
outputMatrix.m_vecMatrix[i][i] = (T);
} return outputMatrix;
} template <typename T>
bool Matrix<T>::GaussianElimination()
{
Matrix<T> outputMatrix = *this; /*Gaussian elmiation*/
for(int k=;k<outputMatrix.m_iRows;k++)
{
/*if all the pivot have been found*/
if(k>=m_iColumns)
{
break;
} /*exchange rows downward to find the row's pivot*/
for(int i=k+;i<outputMatrix.m_iRows;i++)
{
/*pivot is non-zero*/
if(outputMatrix.m_vecMatrix[k][k] != )
{
//T temp = outputMatrix.m_vecMatrix[0][0];
break;
}
else
{
if(i < outputMatrix.m_iRows)
{
outputMatrix.exchangeRows(k,i);
}
}
} /*if there is no pivot in this row*/
if(outputMatrix.m_vecMatrix[k][k] == )
{
break;
} /*elimination:The rows below pivot row subtract times of pivot row*/
for(int i=k+;i<outputMatrix.m_iRows;i++)
{
double RowsfirstData = outputMatrix.m_vecMatrix[i][k]/outputMatrix.m_vecMatrix[k][k];//Save the first data of next(k+1) rows
if(RowsfirstData != )
{
outputMatrix.m_vecMatrix[i][k]=;
for(int j=k+;j<outputMatrix.m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] -= RowsfirstData*outputMatrix.m_vecMatrix[k][j] ;
}
}
}
} *this = outputMatrix;
return true;
} template <typename T>
bool Matrix<T>::rref()
{
Matrix<T> outputMatrix = *this;
int rank=;//the rank of the matrix, how many columns's pivot will it has(-1) /*Gaussian elmiation*/
for(int k=;k<outputMatrix.m_iRows;k++)
{
/*if all the pivot elem have been found*/
if(k>=m_iColumns)
{
break;
} /*exchange rows downward to find the pivot row*/
for(int i=k+;i<outputMatrix.m_iRows;i++)
{
/*pivot is non-zero*/
if(outputMatrix.m_vecMatrix[k][k] != )
{
//T temp = outputMatrix.m_vecMatrix[0][0];
rank++;
break;
}
else
{
if(i < outputMatrix.m_iRows)
{
outputMatrix.exchangeRows(k,i);
}
}
} /*if there is no pivot in this row*/
if(outputMatrix.m_vecMatrix[k][k] == )
{
break;
} /*elimination:The rows below pivot row subtract times of pivot row*/
for(int i=k+;i<outputMatrix.m_iRows;i++)
{
double RowsfirstData = outputMatrix.m_vecMatrix[i][k]/outputMatrix.m_vecMatrix[k][k];//Save the first data of next(k+1) rows
if(RowsfirstData != )
{
outputMatrix.m_vecMatrix[i][k]=;
for(int j=k+;j<outputMatrix.m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] -= RowsfirstData*outputMatrix.m_vecMatrix[k][j] ;
}
}
}
} /*normalizing:set all pivots to 1*/
for(int i=;i<outputMatrix.m_iRows;i++)
{
for(int j=;j<outputMatrix.m_iColumns;j++)
{
if(outputMatrix.m_vecMatrix[i][j] != )//pivot has been foound
{
double pivot = outputMatrix.m_vecMatrix[i][j];//get pivot
for(int k=i;k<outputMatrix.m_iColumns;k++)
{
outputMatrix.m_vecMatrix[i][k] /=pivot;
}
break;
}
}
} /*Back substitution*/
for(int i = rank;i>=;i--)
{
/*find a first non-zero elem (It is pivot)*/
for(int j=;j<outputMatrix.m_iColumns;j++)
{
double times=;
if(outputMatrix.m_vecMatrix[i][j] !=)//pivot found
{
for(int l=i-;l>=;l--)
{
times = outputMatrix.m_vecMatrix[l][j]/outputMatrix.m_vecMatrix[i][j];
for(int k=j;k<outputMatrix.m_iColumns;k++)//tims of this row subtract by each columns in upon row
{
outputMatrix.m_vecMatrix[l][k] -= times*outputMatrix.m_vecMatrix[i][k];
}
}
break;
}
}
} *this = outputMatrix;
return true;
} template <typename T>
bool Matrix<T>::rrefmovie()
{
Matrix<T> outputMatrix = *this;
int rank=;//the rank of the matrix, how many columns's pivot will it has(-1) /*Gauss elmiation*/
cout<<"Gauss elimination:"<<endl;
outputMatrix.printfAll();
for(int k=;k<outputMatrix.m_iRows;k++)
{
/*If all the pivot elem have been found*/
if(k>=m_iColumns)
{
break;
} /*Exchange rows downward to find the pivot row*/
for(int i=k+;i<outputMatrix.m_iRows;i++)
{
/*Pivot is non-zero*/
if(outputMatrix.m_vecMatrix[k][k] != )
{
rank++;
break;
}
else
{
if(i < outputMatrix.m_iRows)
{
outputMatrix.exchangeRows(k,i);
}
}
if(k!=i)
{
cout<<"row"<<k+<<" exchange row"<<i<<endl;//Debug
outputMatrix.printfAll();
}
} /*If there is no pivot in this row*/
if(outputMatrix.m_vecMatrix[k][k] == )
{
break;
} /*Elimination:The rows below pivot row subtract times of pivot row*/
for(int i=k+;i<outputMatrix.m_iRows;i++)
{
double RowsfirstData = outputMatrix.m_vecMatrix[i][k]/outputMatrix.m_vecMatrix[k][k];//Save the first data of next(k+1) rows
if(RowsfirstData != )
{
outputMatrix.m_vecMatrix[i][k]=;
for(int j=k+;j<outputMatrix.m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] -= RowsfirstData*outputMatrix.m_vecMatrix[k][j] ;
}
}
cout<<"row"<<i+<<" - "<<RowsfirstData<<"*"<<"row"<<k+<<endl;//Debug
outputMatrix.printfAll();
}
} /*Normalizing:set all rows pivot to 1*/
for(int i=;i<outputMatrix.m_iRows;i++)
{
for(int j=;j<outputMatrix.m_iColumns;j++)
{
if(outputMatrix.m_vecMatrix[i][j] != )//pivot has been foound
{
double pivot = outputMatrix.m_vecMatrix[i][j];//get pivot
for(int k=i;k<outputMatrix.m_iColumns;k++)
{
outputMatrix.m_vecMatrix[i][k] /=pivot;
}
cout<<"row"<<i+<<" / "<<pivot<<endl;//Debug
outputMatrix.printfAll();//Debug
break;
}
}
} /*Back substitution*/
cout<<"Back substitution:"<<endl;
for(int i = rank;i>=;i--)
{
/*find a first non-zero elem (It is pivot)*/
for(int j=;j<outputMatrix.m_iColumns;j++)
{
double times=;
if(outputMatrix.m_vecMatrix[i][j] !=)//pivot found
{
for(int l=i-;l>=;l--)
{
times = outputMatrix.m_vecMatrix[l][j]/outputMatrix.m_vecMatrix[i][j];
for(int k=j;k<outputMatrix.m_iColumns;k++)//tims of this row subtract by each columns in upon row
{
outputMatrix.m_vecMatrix[l][k] -= times*outputMatrix.m_vecMatrix[i][k];
}
cout<<"row"<<l+<<" - "<<times<<"*"<<"row"<<i+<<endl;
outputMatrix.printfAll();
}
break;
}
}
} *this = outputMatrix;
return true;
} template <typename T>
void Matrix<T>::printfAll()
{
for(int j=;j<m_iRows;j++)
{
cout<<"| ";
for(int i=;i<m_iColumns;i++)
{
cout<<m_vecMatrix[j][i]<<" ";
}
cout<<"|"<<endl;
}
cout<<" \r\n"<<endl;
} template <typename T>
Matrix<T> Matrix<T>::operator+(const Matrix<T> &matrix) //运算符重载“+”为矩阵加法
{
/*matrix leagality check*/
if(this->m_iRows != matrix.getRows() || this->m_iColumns != matrix.getColumns())
{
return *this;
} Matrix<T> outputMatrix;
vector<T> tempVec;
for(int i=;i<this->m_iRows;i++)
{
tempVec.clear();
for(int j=;j<this->m_iColumns;j++)
{
tempVec.push_back(this->m_vecMatrix[i][j] + matrix.m_vecMatrix[i][j]);
}
outputMatrix.addOneRowToBack(tempVec);
} return outputMatrix;
} template <typename T>
Matrix<T> Matrix<T>::operator-(const Matrix<T> &matrix) //运算符重载“-”为矩阵减法
{
/*matrix leagality check*/
if(this->m_iRows != matrix.getRows() || this->m_iColumns != matrix.getColumns())
{
return *this;
} Matrix<T> outputMatrix;
vector<T> tempVec;
for(int i=;i<this->m_iRows;i++)
{
tempVec.clear();
for(int j=;j<this->m_iColumns;j++)
{
tempVec.push_back(this->m_vecMatrix[i][j] - matrix.m_vecMatrix[i][j]);
}
outputMatrix.addOneRowToBack(tempVec);
} return outputMatrix;
} template <typename T>
Matrix<T> Matrix<T>::operator|(const Matrix<T> &matrix)
{
/*input size check*/
if(this->m_iRows != matrix.getRows() )
{
return *this;
} /**/
Matrix<T> outputMatrix = *this;
for(int i=;i<m_iColumns;i++)
{
vector<T> tempVec ;
if(!matrix.getSpecifiedColumn(i,&tempVec))
{
return outputMatrix;
}
outputMatrix.addOneColumToBack(tempVec);
} return outputMatrix;
} template <typename T>
Matrix<T> Matrix<T>::operator*(const Matrix<T> &matrix) //运算符重载*重载为点乘
{
/*matrix leagality check*/
if(this->m_iColumns != matrix.getRows())
{
cout<<"operator*():input ileagal"<<endl;
return *this;
} /*Caculate point multiply*/
//function 1st
Matrix<T> outputMatrix;
vector<T> tempVec;
T tempData;
for(int j=;j<m_iRows;j++)
{
for(int k=;k<matrix.m_iColumns;k++)
{
tempData =;
for(int i=;i<m_iColumns;i++)
{
tempData += this->m_vecMatrix[j][i] * matrix.m_vecMatrix[i][k];
}
tempVec.push_back(tempData);
}
outputMatrix.addOneRowToBack(tempVec);
tempVec.clear(); //clear for next rows adding
} //function 2nd
//vector<T> tempVecRow;
//vector<T> tempVecColumn;
//vector<T> tempVecResult;
//int temp; //for(int k=0;k<m_iRows;k++)
//{
// for(int i=0;i<matrix.getColumns();i++)
// {
// this->getSpecifiedRow(k,&tempVecRow);//get multiplier row
// matrix.getSpecifiedColumn(i,&tempVecColumn);//get multiplicand column
// temp=0;
// for(int j=0;j<(int)tempVecRow.size();j++)
// {
// temp += tempVecRow[j]*tempVecColumn[j];
// }
// tempVecResult.push_back(temp);
// }
// outputMatrix.addOneRowToBack(tempVecResult);
// tempVecResult.clear(); //clear for next rows adding
//} return outputMatrix;
} /*常数乘法*/
template <typename T>
Matrix<T> Matrix<T>::operator*(const double input) //重载运算符“*”常数乘法
{
Matrix<T> outputMatrix = *this;
for(int i=;i<m_iRows;i++)
{
for(int j=;j<m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] *= input;
}
}
return outputMatrix;
}
template <typename T>
Matrix<T> Matrix<T>::operator*(const float input)
{
Matrix<T> outputMatrix = *this;
for(int i=;i<m_iRows;i++)
{
for(int j=;j<m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] *= input;
}
}
return outputMatrix;
}
template <typename T>
Matrix<T> Matrix<T>::operator*(const int input)
{
Matrix<T> outputMatrix = *this;
for(int i=;i<m_iRows;i++)
{
for(int j=;j<m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] *= input;
}
}
return outputMatrix;
} template <typename T>
double Matrix<T>::determinant()
{
//not square
if(m_iColumns != m_iRows)
return ; /*function 1st:recursion*/
//double result = det_recursion(*this); /*function 2nd*/
//1:Gaussian elimination
//2:Diagonal multipication
Matrix<T> tempMatrix = *this;
tempMatrix.GaussianElimination(); double result=;
for(int i=;i<m_iRows;i++)
{
result*=tempMatrix.m_vecMatrix[i][i];
} return result;
} template <typename T>
double Matrix<T>::det_recursion(Matrix<T> &matrix)
{
double result=;
if(matrix.m_iRows!=)
{
for(int i=;i<matrix.m_iColumns;i++)
{
Matrix<T> tempMatrix = matrix.getAlgebraicCofactor(i,);
if(i%==)//even
{
result+=matrix.m_vecMatrix[i][]*det_recursion(tempMatrix);
}
else//old
{
result-=matrix.m_vecMatrix[i][]*det_recursion(tempMatrix);
}
}
return result;
}
else
{
return (double)matrix.m_vecMatrix[][]*matrix.m_vecMatrix[][] - (double)matrix.m_vecMatrix[][]*matrix.m_vecMatrix[][];
}
} template <typename T>
Matrix<T> Matrix<T>::getAlgebraicCofactor(int row,int column)
{
if(row< || column< || row >m_iColumns- || column>m_iColumns-)
{
return *this;
} Matrix<T> outputMatrix(this->m_iRows-,this->m_iColumns-); for(int i=;i<this->m_iRows;i++)
{
for(int j=;j<this->m_iColumns;j++)
{
if(i<row )
{
if(j<column)
outputMatrix.m_vecMatrix[i][j] = this->m_vecMatrix[i][j];
else if(j>column)
outputMatrix.m_vecMatrix[i][j-] = this->m_vecMatrix[i][j];
}
else if(i>row)
{
if(j<column)
outputMatrix.m_vecMatrix[i-][j] = this->m_vecMatrix[i][j];
else if(j>column)
outputMatrix.m_vecMatrix[i-][j-] = this->m_vecMatrix[i][j];
} }
}
return outputMatrix;
} template <typename T>
bool Matrix<T>::calAdjugateMatrix(Matrix<double> *matrix)
{
if(determinant() == )
return false ; Matrix<double> outputMatrix(m_iRows,m_iColumns);
for(int i=;i<m_iRows;i++)
{
for(int j=;j<m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] = getAlgebraicCofactor(i,j).determinant();
}
}
*matrix = outputMatrix;
return true;
} template <typename T>
Matrix<T> Matrix<T>::transpose()
{
Matrix<T> tempMatrix;
vector<T> tempVec; /*get transpose*/
for(int i=;i<m_iColumns;i++)
{
this->getSpecifiedRow(i,&tempVec);
tempMatrix.addOneColumToBack(tempVec);
} /*swap rows number and columns number*/
m_vecMatrix = tempMatrix.m_vecMatrix;
int temp = m_iColumns;
m_iColumns = m_iRows;
m_iRows = temp; return tempMatrix;
} template <typename T>
bool Matrix<T>::relevantCheck(vector<T> &vecA,vector<T> &vecB)
{
if(vecA.size()!=vecB.size())
{
return false;
} int length = vecA.size();
T timesofA,timesofB;
int i;
for(i=;i<length;i++)
{
if(vecA[i]!= || vecB[i]!=)
{
timesofA=vecA[i];
timesofB=vecB[i];
break;
}
if(i == length-)
{
return true;
}
}
i+=;
for(i;i<length;i++)
{
if(timesofA*vecB[i] != timesofB*vecA[i])
return false;
}
return true; } template <typename T>
bool Matrix<T>::invertibleCheck()
{ /*rows relevant check*/
for(int i=;i<m_iRows-;i++)
{
vector<T> vecA;
vector<T> vecB;
for(int j=i+;j<m_iRows;j++)
{
getSpecifiedRow(i,&vecA);
getSpecifiedRow(j,&vecB);
if(relevantCheck(vecA,vecB))
{
return false;
}
}
} /*columns relevant check*/
for(int i=;i<m_iRows-;i++)
{
vector<T> vecA;
vector<T> vecB;
for(int j=i+;j<m_iRows;j++)
{
getSpecifiedColumn(i,&vecA);
getSpecifiedColumn(j,&vecB);
if(relevantCheck(vecA,vecB))
{
return false;
}
}
} return true;
} template <typename T>
bool Matrix<T>::inverse()
{
/*Determinant equart 0,there is no inverse.*/
if(this->determinant() == )
{
return false;
} /*Make an Identity*/
Matrix<T> I =this->reduceAnIdentity( this->m_iRows ); /*Augmented by I and do rref*/
Matrix<T> augmentationMatrix=*this|I;
augmentationMatrix.rref();
//augmentationMatrix.rrefmovie(); Matrix<T> outputMatrix;
vector<T> tempVec;
for(int i=;i<m_iColumns;i++)
{
augmentationMatrix.getSpecifiedColumn(m_iRows+i,&tempVec);
outputMatrix.addOneColumToBack(tempVec);
} *this = outputMatrix; return true;
} template <typename T>
bool Matrix<T>::clear()
{
m_vecMatrix.clear();
return true;
}
#endif

分组解析:

基本成员解析:

算术运算:

其他运算:

线性代数-矩阵-【1】矩阵汇总 C和C++的实现的更多相关文章

  1. 【线性代数】2-4:矩阵操作(Matrix Operations)

    title: [线性代数]2-4:矩阵操作(Matrix Operations) toc: true categories: Mathematic Linear Algebra date: 2017- ...

  2. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  3. C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速

    Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...

  4. Python 矩阵与矩阵以及矩阵与向量的乘法

    import numpy as np numpy模块的array相乘时,有两种方式:一是矩阵形式,二是挨个相乘. 需要用矩阵形式相乘时,则要用np.dot()函数. #矩阵与矩阵相乘a = np.ar ...

  5. POJ - 3233 矩阵套矩阵

    题意:给你矩阵\(A\),求\(S=\sum_{i=1}^{k}A^i\) 构造矩阵 \[ \begin{bmatrix} A & E \\ 0 & E\\ \end{bmatrix} ...

  6. MATLAB特殊矩阵以及矩阵转置

    特殊矩阵 通用特殊矩阵 zeros函数:产生全0矩阵,即零矩阵. ones函数:产生....1矩阵,即幺矩阵. eye函数:产生对角线为1的矩阵,当矩阵是方正时,得到单位矩阵. rand函数:产生(0 ...

  7. hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)

    题目大意: 求出斐波那契中的 第 k*i+b 项的和. 思路分析: 定义斐波那契数列的矩阵 f(n)为斐波那契第n项 F(n) = f(n+1) f(n) 那么能够知道矩阵 A = 1 1 1  0 ...

  8. AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂

    AcWing 206. 石头游戏 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明. 操作序列是一个长度不 ...

  9. POJ3233不错的矩阵(矩阵套矩阵)

    题意:        给一个n*n的矩阵A,然后求S=A + A^2 + A^3 + ..+ A^k. 思路:       矩阵快速幂,这个题目挺新颖的,以往的矩阵快速幂都是退出公式,然后构造矩阵,这 ...

  10. 线性代数笔记10——矩阵的LU分解

    在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积).LU分解主要应用在数值分析 ...

随机推荐

  1. 【HTML】谈谈html的meta标签

    一.定义&用法 <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头 ...

  2. 【samba】samba 用户权限配置(转)

    首先要保证你的samba安装并配置好,关于安装和配置samba请参考此文章 http://blog.csdn.net/linglongwunv/archive/2010/01/19/5212875.a ...

  3. jsp元素

    1.指令元素:用于在JSP转换为Servlet阶段提供JSP页面的相关信息,如页面采用的字符编码集.页面中需要导入的类等信息,指令元素不会产生任何的输出到当前JSP的输出流中 指令元素有三种指令:pa ...

  4. php apache phpmyadmin mysql环境安装

    文件下载: Apache: http://httpd.apache.org/download.cgi PHP,phpMyAdmin,mysql,API下载:http://pan.baidu.com/s ...

  5. Flunetd 用于统一日志记录层的开源数据收集器

    传统的日志查看方式 使用fluentd之后 一.介绍 Fluentd是一个开源的数据收集器,可以统一对数据收集和消费,以便更好地使用和理解数据. 几大特色: 使用JSON统一记录 简单灵活可插拔架构 ...

  6. little bird

    LITTLE BIRD Bzoj 3831 相对而言是一道比较简单的DP,不过它需要用单调队列优化.首先是朴素O(n2), if(d[j]>f[i]) f[i]=min(f[i],f[j]); ...

  7. 经验分享:极速化 CocoaPods

    Cocopods 本身是一个优秀的 iOS 开发的包管理工具,涵盖了 7k+ 的开源组件,包管理库是托管在 Github.由于众所周知的原因它的速度日渐缓慢,有时会频繁报如下错误: 1 2 3 4 $ ...

  8. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  9. HDU--1358--KMP算法失配函数getfail()的理解--Period

    /* Name: hdu--1358--Period Author: 日天大帝 Date: 20/04/17 10:24 Description: 长度/向后移动的位数 = 出现的次数 kmp其实匹配 ...

  10. hdu--5351--MZL's Border

    表示看这篇博客后找到了思路: http://blog.csdn.net/queuelovestack/article/details/47291195 补充一下数据,方便观察规律 m  LBorder ...