📄 wzjarray.cpp
字号:
// WzjArray.cpp: implementation of the CWzjArray class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WzjArray.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//无参构造
CWzjArray::CWzjArray()
{
m_szUnitData = NULL;
m_dUnitData = NULL;
m_nRow = m_nColumn = 0;
}
//用字符串构造矩阵对象,获取每一个值放到字符串数组中
CWzjArray::CWzjArray(CString str, CString szInterStr /*= ","*/, BOOL bAutoDel /*=FALSE*/)
{
m_szUnitData = NULL;
m_dUnitData = NULL;
SetArrayData(str, szInterStr, bAutoDel);
}
//用二维指针(数组)构造矩阵对象
CWzjArray::CWzjArray(double **pdArrayData,int nRow,int nCol, BOOL bAutoDel /*= FALSE*/)
{
m_szUnitData = NULL;
m_dUnitData = NULL;
SetArrayData(pdArrayData, nRow, nCol, bAutoDel);
}
CWzjArray::~CWzjArray()
{
if (TRUE == m_bAutoDelete)
{
if (m_szUnitData)
{
Delete2Array(m_szUnitData, m_nRow);
}
if (m_dUnitData)
{
Delete2Array(m_dUnitData, m_nRow);
}
}
}
//获得整体字符串数据
CString CWzjArray::GetTotalArrayStr() const
{
return m_WzjArrayData;
}
//用字符串设置距阵对象
void CWzjArray::SetArrayData(CString strSource, CString szInterStr /*=" ,"*/, BOOL bAutoDel /*=FALSE*/)
{
m_WzjArrayData = strSource;
m_szInterStr = szInterStr;
GetUnitStr();
m_bAutoDelete = bAutoDel;
}
//用指针数组设置距阵对象
void CWzjArray::SetArrayData(double **pdArrayData, int nRow, int nCol, BOOL bAutoDel /*=TRUE*/)
{
New2Array(m_dUnitData,nRow,nCol);
m_dUnitData = pdArrayData;
m_nRow = nRow;
m_nColumn = nCol;
m_bAutoDelete = bAutoDel;
}
//字符串时获得行
int CWzjArray::GetRow() const
{
CString strArray = m_WzjArrayData;
strArray.TrimLeft();
strArray.TrimRight();
int nOneRowStrCount = 0;
int row = 0;
nOneRowStrCount = strArray.Find('\r\n');
if (nOneRowStrCount == -1)
{
row = 1;
}
else
{
while (nOneRowStrCount!=-1)
{
row++;
strArray=strArray.Right(strArray.GetLength() - nOneRowStrCount);
strArray.TrimLeft();
nOneRowStrCount = strArray.Find('\r\n');//获得一行的个数
}
row++;
}
return row;
}
//字符串时获得列
int CWzjArray::GetColumn() const
{
CString strArray = m_WzjArrayData;
int nOnceStrCount = 0;
int column = 0;
int nOneRowStrCount = 0;
nOneRowStrCount=strArray.Find('\r\n');
if (nOneRowStrCount != -1)
strArray = strArray.Left(nOneRowStrCount);
strArray.TrimLeft();
strArray.TrimRight();
nOnceStrCount=strArray.Find(m_szInterStr);
if(nOnceStrCount==-1)
{
column=1;
}
else
{
while(nOnceStrCount!=-1) //比较用m_szInterStr和"\r\n"得到的字符个数
{
column++;
strArray = strArray.Right(strArray.GetLength()-(nOnceStrCount+1));
nOnceStrCount=strArray.Find(m_szInterStr);// 逐个地提取m_szInterStr号,看包含几个数
}
column++;
}
return column;
}
//字符串设置数组自动调用,获取每一个单元数据和行,列数值
void CWzjArray::GetUnitStr()
{
CString strArray = m_WzjArrayData;
m_nRow = GetRow();
m_nColumn = GetColumn();
int r = m_nRow;
int c = m_nColumn;
int i,j;
int nOnceStrCount=0;
//根据得到的维数定义二维数组来存放每一个数据
New2Array(m_szUnitData, r, c);
//得到每一个数据
for (i=0; i<r-1; i++)//前r-1行的数据
{
for (j=0; j<c-1; j++) //前c-1列数据提取的时候是","前的数据
{
nOnceStrCount = strArray.Find(m_szInterStr);////////////
m_szUnitData[i][j] = strArray.Left(nOnceStrCount);
m_szUnitData[i][j].TrimLeft();
m_szUnitData[i][j].TrimRight();
strArray = strArray.Right(strArray.GetLength()-(nOnceStrCount+1));
}
nOnceStrCount = strArray.Find('\r\n'); //每一行最后一个数据是"\r\n"之前的数据
m_szUnitData[i][c-1] = strArray.Left(nOnceStrCount);
m_szUnitData[i][c-1].TrimLeft();
m_szUnitData[i][c-1].TrimRight();
strArray = strArray.Right(strArray.GetLength() - nOnceStrCount);
strArray.TrimLeft();//去掉提取数据后最前面的回车符
}
//提取最后一行数据
for (j=0; j < c-1; j++)//
{
nOnceStrCount = strArray.Find(m_szInterStr);
m_szUnitData[r-1][j]= strArray.Left(nOnceStrCount);
m_szUnitData[r-1][j].TrimLeft();
m_szUnitData[r-1][j].TrimRight();
strArray = strArray.Right(strArray.GetLength()-(nOnceStrCount+1));
}
strArray.TrimRight();//如果有回车符,清除
m_szUnitData[r-1][c-1] = strArray;
m_szUnitData[r-1][c-1].TrimLeft();
m_szUnitData[r-1][c-1].TrimRight();
}
//两个矩阵相加
CWzjArray CWzjArray::operator + (CWzjArray arr2)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
CWzjArray arr(dArray, m_nRow, m_nColumn);
arr.Reset();
if((m_nRow != arr2.m_nRow) || (m_nColumn != arr2.m_nColumn))
{
AfxMessageBox("两个相加的矩阵行或列不一致,将返回一个个元素为0的矩阵");
return arr;
}
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
arr.m_dUnitData[i][j] = m_dUnitData[i][j] + arr2.m_dUnitData[i][j];
}
}
return arr;
}
//两个矩阵相加
CWzjArray CWzjArray::operator - (CWzjArray arr2)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
CWzjArray arr(dArray, m_nRow, m_nColumn);
if((m_nRow != arr2.m_nRow) || (m_nColumn != arr2.m_nColumn))
{
AfxMessageBox("两个相减的矩阵行或列不一致,将返回一个个元素为0的矩阵");
return arr;
}
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
arr.m_dUnitData[i][j] = m_dUnitData[i][j] - arr2.m_dUnitData[i][j];
}
}
return arr;
}
//距阵乘法
CWzjArray CWzjArray::operator * (CWzjArray array2)
{
double **dArray;
New2Array(dArray, m_nRow, array2.m_nColumn);
CWzjArray arr(dArray, m_nRow, array2.m_nColumn);
arr.Reset();
if (m_nColumn != array2.m_nRow)
{
AfxMessageBox("两个相乘的矩阵左矩阵列和右矩阵的行不一致,将返回一个个元素为0的元素");
return arr;
}
int lrow = m_nRow;//左边距阵的行
int column = m_nColumn;//同时也是右边距阵的行
int rcolumn = array2.m_nColumn;
int lr,theSame,rc;
double fSum,fTemp;
// 返回CWzjArray数据 的成员变量
for (lr=0; lr < lrow; lr++)
{
for (rc=0; rc<rcolumn; rc++)
{
fSum=0.0;
for (theSame = 0; theSame < column; theSame++)
{
fTemp = m_dUnitData[lr][theSame] * array2.m_dUnitData[theSame][rc];
fSum += fTemp;
}
arr.m_dUnitData[lr][rc]=fSum;
}
}
return arr;
}
//矩阵和一个数相加
CWzjArray CWzjArray::operator + (double dAdd)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
dArray[i][j] = m_dUnitData[i][j] + dAdd;
}
}
return CWzjArray(dArray, m_nRow, m_nColumn);
}
//矩阵和一个数相减
CWzjArray CWzjArray::operator - (double dSub)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
dArray[i][j] = m_dUnitData[i][j] - dSub;
}
}
return CWzjArray(dArray, m_nRow, m_nColumn);
}
//矩阵和一个数相乘
CWzjArray CWzjArray::operator *(double dTimes)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
dArray[i][j] = m_dUnitData[i][j] * dTimes;
}
}
return CWzjArray(dArray, m_nRow, m_nColumn);
}
//矩阵除以一个数
CWzjArray CWzjArray::operator /(double dDiv)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
CWzjArray arr(dArray, m_nRow, m_nColumn);
arr.Reset();
if (fabs(dDiv) < 1e-8)
{
AfxMessageBox("矩阵除以0无意义,即将返回一个所有元素为0的矩阵");
return arr;
}
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
arr.m_dUnitData[i][j] = m_dUnitData[i][j] / dDiv;
}
}
return arr;
}
//一个数减去矩阵
CWzjArray CWzjArray::Sub(double dBySub)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
CWzjArray arr(dArray, m_nRow, m_nColumn);
arr.Reset();
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
arr.m_dUnitData[i][j] = dBySub - m_dUnitData[i][j];
}
}
return arr;
}
//一个数除以矩阵
CWzjArray CWzjArray::Divide(double dByDiv)
{
double** dArray;
New2Array(dArray, m_nRow, m_nColumn);
CWzjArray arr(dArray, m_nRow, m_nColumn);
arr.Reset();
for (int i = 0; i < m_nRow; i++)
{
for (int j = 0; j < m_nColumn; j++)
{
if (fabs(m_dUnitData[i][j]) < 1e-8)
{
AfxMessageBox("一个数除以了矩阵一个为0的元素,无意义");
return arr;
}
arr.m_dUnitData[i][j] = dByDiv / m_dUnitData[i][j];
}
}
return arr;
}
//矩阵乘方或开放运算
CWzjArray CWzjArray::Pow(double dPow)
{
double** dArray;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -