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

在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. Python基础之常用模块(二)

    一.sys模块 1.sys.exit() 退出程序,这是正常退出程序,与之前用的break不同的是,break只是退出循环,循环之后的代码还会正常运行 2.sys.argv  会返回一个列表,列表中的 ...

  2. 【HTML】section

    1.  定义 标签定义文档中的节(section.区段).比如章节.页眉.页脚或文档中的其他部分. 2. div.section . article的区别 div: 本身没有任何语义,用作布局以及样式 ...

  3. Asp.net MVC Razor常见问题及解决方法

    没有经验的童鞋就是这样磕磕碰碰出来的经验. 1,Datatype的错误提示消息无法自定义 这也许是Asp.net MVC的一个Bug.ViewModel中定义了DataType为Date字段: [Re ...

  4. tcpdump使用方法小结

    在进行网络测试的时候,我们经常需要进行抓包的工作,当然有许多测试工具可以使用,比如sniffer, ethreal等.但最为方便和简单得就非TCPDump莫属. Linux的发行版里基本都包括了这个工 ...

  5. tomcat 与 java web中url路径的配置以及使用规则详情(长期更新)

    首先我们看一下在myeclipse中建立的java web项目的结构 在这里我们需要注意这个webroot也就是我们在tomcat里的webapp里面的应用 之所以每一个项目都有这个webroot,是 ...

  6. wamp问题:关于另个php.ini文件的”…

    一.现象解说 修改从图表打开的php.ini文件,重启apache后,我们的问题没有解决... 二.解决方法 1.php.ini的位置 wamp/apache2/bin/php.ini wamp/ph ...

  7. JAVA,JSP,Servlet获取当前工程路径-绝对路径

    在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getPro ...

  8. Given two binary string, return their sum (also a binary string)

    主要思路:将二进制转化为十进制,然后进行十进制加法,最后再将加法所得的结果转化为二进制 public class BinarySum2 { public static void main(String ...

  9. hdu--1077--Catching Fish

    思路:   1.枚举两点确定圆心,大于2不用考虑   2.逐个判断判断距圆心的距离小于1.00001符合题意 这个题,主要在求圆心上废了不少功夫,但是仍存在问题 #include<iostrea ...

  10. Windows下WebStorm使用SVN(转)

    安装了WebStorm之后,想配置svn,结果在file->settings->Version Contorl->subversion->with conmand line c ...