没有合适的资源?快使用搜索试试~ 我知道了~
第8章 9.1typedef enum { pointer_is_null, newLength_less_than_zero } arrayStack_err
资源推荐
资源详情
资源评论
32.下上三角矩阵乘法
按照题目要求,结果用二维数组存储,使用 matrix 类存储的代码版本见文末附录。
上下三角矩阵的实现亦见附录。
const int** operator * ( LowerTriangularMatrix <int> & l, LowerTriangularMatrix<int> & r ) {
/*首先判断能否相乘*/
if ( l.getN () != r.getN () ) {
throw not_match;
}
int size = l.getN ();
/*建立结果数组*/
int** result = new int* [size];
for ( int i = 0; i < size; i++ ) {
result[i] = new int[size];
}
/*乘积第 m 行第 n 列的元素等于左矩阵的第 m 行元素与右矩阵的第 n 列对应元素乘积之和*/
for ( int m = 1; m <= size; m++ ) {
for ( int n = 1; n <= size; n++ ) {
int value = 0;
for ( int i = 1; i <= size; i++ ) {
value += l.get ( m, i ) * r.get ( i, n );
}
result[m][n] = value;
}
}
return result;
}
复杂度:
O(n^3)
结果矩阵与三角矩阵的赋值取值操作时间复杂度均为 O(1)
矩阵乘法本身需要进行三层嵌套循环,即进行 n^3 次元素加法操作
故总体复杂度为 O(n^3)
34.C 形矩阵
1)给出一个 4*4C 形矩阵及其压缩表示方式
1 1 1 1
1 0 0 0
1 0 0 0
1 1 1 1
压缩表示:
使用 3n-2 长度的一维数组:1 1 1 1 1 1 1 1 1 1
当 i==1 L(i,j)=element[j-1]
当 i==n L(i,j)=element[2*n-2+j]
当 j==1 L(i,j)=element[n+i-1]
其他情况,L(i,j)=0
2)证明最多有 3n-2 个非 0 元素
第一行,最后一行,第一列都无 0 的情况下非零元素最多,此时两行一列有 3n 个元素,减去行列重合处的两个
元素,即非零元素最多有 3n-2 个。
35.反对角矩阵
1)给出一个 4*4 反对角矩阵的例子
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
2)证明最多有 n 个非 0 元素
由 “下标符合 i+j != n+1 的元素值为 0” 可知,所有不位于反对角线上的元素都为 0
又因为反对角线有 n 个元素,当这些元素都不为 0 时,非零元素最多,有 n 个。
3)用 n 个元素的一维矩阵表示反对角矩阵
一维数组表示反对角线,由于一行只有一个元素,因此只用行数作为数组的索引-1 就可以。
当 i+j!=n+1 L(i,j)=0
当 i+j==n+1 L(i,j)=element[i-1]
36.等对角矩阵
1)证明 n*n 等对角矩阵最多有 2n-1 个不同元素
由题意得,除第一行与第一列外,每个元素都与其左上方元素相等
也即当第一行与第一列元素各不相同时,其数目就是该题所指的最大不同元素数,为 2n-1
2)设计映射,将等对角矩阵映射到 2n-1 长度数组。
当 i<=j L(i,j)=element[j-i]
当 i>j L(i,j)=element[n+i-j-1]
4)等对角矩阵乘法
按照题目要求,结果用二维数组存储,使用 matrix 类存储的代码版本见文末附录。
/*等对角矩阵乘法*/
const int** operator * ( EquidiagonalMatrix <int>& l, EquidiagonalMatrix<int>& r ) {
/*首先判断能否相乘*/
if ( l.getN () != r.getN () ) {
throw not_match;
}
int size = l.getN ();
/*建立结果数组*/
int** result= new int * [size];
for ( int i = 0; i < size; i++ ) {
result[i] = new int[size];
}
/*乘积第 m 行第 n 列的元素等于左矩阵的第 m 行元素与右矩阵的第 n 列对应元素乘积之和*/
for ( int m = 1; m <= size; m++ ) {
for ( int n = 1; n <= size; n++ ) {
int value = 0;
for ( int i = 1; i <= size; i++ ) {
value += l.get ( m, i ) * r.get ( i, n );
}
result[m][n]=value;
}
}
return result;
}
剩余11页未读,继续阅读
资源评论
养生的控制人
- 粉丝: 18
- 资源: 333
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功