?? 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 + -