记录下一道简单题目的实现:将一个二维矩阵A转换为B,B[i][j]的值用A中i行的最大值和j列的最小值的平均值为替换。
解题思路很简单,求一下每行的最大值和每列的最小值,分别存起来。接下来就是求平均数了。
为了练习下模板,写了个模板类记录下(主要知识点在代码中有注释)!
开发环境:vc2012和Fedora20
模板类定义及实现Matrix.h:
/*
写模板类注意事项:
1. 模板类的声明与定义(实现)必须放在同一文件中, 若分开在实例化时可能会找不到其定义
2. 模板特化可以与声明分开
*/
#ifndef __MATRIX_H__
#define __MATRIX_H__
#include <iostream>
#include <stddef.h>
#include <assert.h>
using namespace std;
// --------------------- 模板类声明 -------------------
template <typename T>
class CMatrix // 二维矩阵模板类
{
public:
CMatrix(int r = 0, int c = 0)
{
rows = r;
cols = c;
arr = NULL;
if(rows > 0 && cols > 0)
{
arr = new T*[rows]; // 生成指针数组(长度为rows)
assert(arr != NULL);
for(int i = 0; i < rows; i++)
arr[i] = new T[cols]; // 为每个指针分配空间(长度为cols)
}
}
~CMatrix()
{
if(arr)
{
for(int i = 0; i < rows; i++)
{
if(arr[i])
delete arr[i]; // 释放每一行向量
}
delete [] arr; // 释放指针数组
}
}
T getMaxInRow(int r) const // 求二维数组r行中的最大值
{
T max = arr[r][0]; // 取行中第一个元素
for(int i = 1; i < cols; i++)
{
if(max < arr[r][i])
max = arr[r][i];
}
return max;
}
T getMinInCol(int c) const // 求二维数组c列中的最小值
{
T min = arr[0][c]; // 取列中第一个元素
for(int i = 1; i < rows; i++)
{
if(min > arr[i][c])
min = arr[i][c];
}
return min;
}
bool setValue(int i, int j, T v);
void display();
public:
int rows;
int cols;
T** arr;
};
template <typename T>
class CMatrixChanger
{
public:
// 将matIn声明为const后, 将只能访问matIn中的const成员(变量或函数)
static void Convert(const CMatrix<T>& matIn, CMatrix<T>& matOut);
};
// ------------------------ 模板类定义(实现) ----------------
template <typename T>
bool CMatrix<T>::setValue(int i, int j, T v)
{
if(i < rows && j < cols)
{
arr[i][j] = v;
return true;
}
return false;
}
template <typename T>
void CMatrix<T>::display()
{
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
cout << arr[i][j] << '\t';
cout << endl;
}
}
/*
功能: 矩阵转换(规则: 求矩阵A[][]中i行中最大值与j列中最小值的平均值), 将结果存放到matOut.arr[][]
*/
template <typename T>
void CMatrixChanger<T>::Convert(const CMatrix<T>& matIn, CMatrix<T>& matOut)
{
int nr = matIn.rows;
int nc = matIn.cols;
T* r_max = new T[nr]; // 保存每一行的最大值
T* c_min = new T[nc]; // 保存每一列的最小值
int i, j;
for(i = 0; i < nr; i++)
{
r_max[i] = matIn.getMaxInRow(i);
}
for(i = 0; i < nc; i++)
{
c_min[i] = matIn.getMinInCol(i);
}
for(i = 0; i < nr; i++)
{
for(j = 0; j < nc; j++)
{
matOut.arr[i][j] = (r_max[i] + c_min[j]) / 2.0; // 取所在行最大值与所在列最小值的平均值
}
}
delete [] r_max;
delete [] c_min;
}
#endif
主函数来调用下main.cpp:
#include <stdlib.h>
#include <time.h>
#include "Matrix.h"
#define ROWS 4
#define COLS 5
void test()
{
CMatrix<double> matIn(ROWS, COLS), matOut(ROWS, COLS);
srand((unsigned)time(NULL)); // 初始化随机数种子
for(int i = 0; i < ROWS; i++)
{
for(int j = 0; j < COLS; j++)
{
double v = rand() % 320; // 产生一个[0-320)之间的随机整数来初始化二维数组
matIn.setValue(i, j, v);
}
}
matIn.display();
CMatrixChanger<double>::Convert(matIn, matOut);
cout << endl;
matOut.display();
}
int main()
{
test();
return 0;
}
编译及运行(取自Fedora20):
[zcm@matrix #293]$make
g++ -c -o main.o main.cpp
g++ -o main main.o -Wall -Os
[zcm@matrix #294]$./main
228 83 263 173 93
152 73 318 160 23
207 292 259 250 314
241 46 171 72 134
207.5 154.5 217 167.5 143
235 182 244.5 195 170.5
233 180 242.5 193 168.5
196.5 143.5 206 156.5 132
[zcm@matrix #295]$