对称矩阵相应元素,一维数组储存其元素转化至下三角的相应公式
时间: 2024-02-29 14:55:05 浏览: 139
设对称矩阵为 $A$,其维数为 $n\times n$,$a_{ij}$ 表示矩阵 $A$ 中第 $i$ 行第 $j$ 列的元素,其中 $i\leq j$。将对称矩阵 $A$ 转化为下三角矩阵 $B$,则可以使用如下公式将其元素存储到一维数组中:
$$
B_{k}=
\begin{cases}
a_{ij},& \text{if } k = \frac{i(i-1)}{2}+j, i\geq j\\
a_{ji},& \text{if } k = \frac{j(j-1)}{2}+i, i< j\\
\end{cases}
$$
其中 $k$ 表示下三角矩阵 $B$ 中元素在一维数组中的下标,$i$ 和 $j$ 分别表示对称矩阵 $A$ 中元素 $a_{ij}$ 在 $A$ 中的行和列下标。这个公式的基本思路是将对称矩阵 $A$ 的下三角元素依次存储到一维数组中,即按照每行从左到右、从上到下的顺序存储。
相关问题
对称矩阵压缩到一维数组的代码,C语言
以下是将对称矩阵压缩为一维数组的C语言代码示例:
```c
#include <stdio.h>
#define N 3
int main() {
int matrix[N][N] = {{1, 2, 3}, {2, 4, 5}, {3, 5, 6}}; // 对称矩阵
int array[N * (N + 1) / 2]; // 压缩后的一维数组
int k = 0;
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) { // 只需要遍历上三角部分,包括对角线
if (i == j) {
array[k] = matrix[i][j]; // 对角线上的元素单独存储
} else {
array[k] = matrix[i][j];
array[N * (N + 1) / 2 - 1 - k] = matrix[i][j]; // 对称位置的元素也要存储
}
k++;
}
}
// 打印压缩后的一维数组
for (int i = 0; i < N * (N + 1) / 2; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
```
输出结果为:`1 2 3 4 5 6`,对应压缩后的一维数组。
一、问题描述 A 和 B 为两个 N 阶对称矩阵,求两个对称矩阵之和与乘积 、基本要求 (1)输人:只输人对称矩阵下三角元素,存储在一维数组中 (2)输出:以阵列方式输出 (3)实现两个对称矩阵的和 (4)实现两个对称矩阵的乘积 、设计提示 1.数据结构设计 N 阶对称矩阵形式上是个二维数组,压缩存储时只存储其对角线及其上或其下的元素到大小为 2* N-1的一维数组。按题目要求,存储下三角元素。 2.功能设计 完成该实验至少涉及以下4个功能 (1) 创建矩阵 (2)输出矩阵(3)求对称矩阵A和B的和。 (4)求对称矩阵A和B的乘积。
以下是一个简单的 C++ 实现,实现了上述要求:
```c++
#include <iostream>
using namespace std;
const int MAXN = 100;
int A[MAXN*(MAXN+1)/2], B[MAXN*(MAXN+1)/2], C[MAXN*(MAXN+1)/2], D[MAXN*(MAXN+1)/2];
// 创建对称矩阵
void createMatrix(int mat[], int n) {
int idx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> mat[idx++];
}
}
}
// 输出对称矩阵
void printMatrix(int mat[], int n) {
int idx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << mat[idx++] << " ";
}
cout << endl;
}
}
// 计算两个对称矩阵的和
void addMatrix(int A[], int B[], int C[], int n) {
int idx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
C[idx] = A[idx] + B[idx];
idx++;
}
}
}
// 计算两个对称矩阵的乘积
void multiplyMatrix(int A[], int B[], int D[], int n) {
int idx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
int sum = 0;
for (int k = 1; k <= i; k++) {
if (k >= j) {
sum += A[idx-k+j-1] * B[(k-1)*k/2+i-1];
} else {
sum += A[idx+j-k-1] * B[(j-1)*j/2+k-1];
}
}
D[idx] = sum;
idx++;
}
}
}
int main() {
int n;
cout << "请输入矩阵阶数:";
cin >> n;
cout << "请输入对称矩阵 A:";
createMatrix(A, n);
cout << "请输入对称矩阵 B:";
createMatrix(B, n);
cout << "对称矩阵 A:" << endl;
printMatrix(A, n);
cout << "对称矩阵 B:" << endl;
printMatrix(B, n);
addMatrix(A, B, C, n);
cout << "对称矩阵 A+B:" << endl;
printMatrix(C, n);
multiplyMatrix(A, B, D, n);
cout << "对称矩阵 A*B:" << endl;
printMatrix(D, n);
return 0;
}
```
该程序使用一维数组存储对称矩阵,根据输入的下三角元素计算出每个元素在数组中的下标。在计算两个对称矩阵的乘积时,使用了一个小技巧:先将下标转换成对应的行和列,然后按照矩阵乘法的定义计算。
阅读全文