在矩阵中找到与主对角线平行的元素
Finding elements parlallel to main diagonal in a matrix
我必须制作一个程序,该程序找到平行于主角的矩阵元素的总和。我不知道如何找到与主对角线平行的元素。i == J仅适用于主角。假设我们有这样的矩阵:
22 5 6 4
32 45 7 9
1 21 43 6
7 5 9 11
我必须分别找到总和:4;6 9;5 7 6;22 45 43 11;32 21 9;1 5;7
After the changes the code become like this:
#include <stdio.h>
#include <cmath>
#include <cstdlib>
#define N 50
void enter_matrix (float m[N][N],int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("Enter %d %d element of the matrix: ",i+1,j+1);
scanf("%f",&m[i][j]);
}
}
}
void show_matrix(float m[N][N],int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%.2ft",m[i][j]);
}
printf("n");
}
}
int find_sums(float m[N][N],float sum[100],int n){
int j=0;
for(int offset = -n+1; offset < n; ++offset) {
float sum1 = 0;
for(int i = 0; i < n-fabs(offset); ++i) {
if(offset <= 0) {
sum1 += m[i][i-offset];
}
else {
sum1 += m[i+offset][i];
}
sum[j]=sum1;j++;printf("%.2f n",sum1);
}
}
return j;
}
int find_max(float sum, int j){
int i,maxn;float *s,max=0;s=∑
for(i=0;i<j;i++){
if(*(s+1)>max){
max=*(s+1);
maxn=i;
}
}
return maxn;
}
int find_min(float sum, int j){
int i,minn;
float *s;
s=∑float min=*(s+0);
for(i=0;i<j;i++){
if(*(s+1)<min){
min=*(s+1);
minn=i;
}
}
return minn;
}
void main(){
float matrix [N][N], sum[100],*s;
int n,j,maxn,minn;
s=sum;
do{
printf("Enter matrix dimension (between 1 and 50):");
scanf("%d",&n);
}
while(n<=0||n>50);
enter_matrix(matrix,n);
show_matrix(matrix,n);
j=find_sums(matrix,sum,n);
maxn=find_max(sum[100],j);
minn=find_min(sum[100],j);
printf("Maximum sum is equal to %.2f, at line %dn",sum[maxn],maxn+1);
printf("Minimum sum is equal to %.2f, at line %dn",sum[minn],minn+1);
}
,输出就是这样:
Enter matrix dimension (between 1 and 50):3
Enter 1 1 element of the matrix: 1
Enter 1 2 element of the matrix: 2
Enter 1 3 element of the matrix: 3
Enter 2 1 element of the matrix: 4
Enter 2 2 element of the matrix: 5
Enter 2 3 element of the matrix: 6
Enter 3 1 element of the matrix: 7
Enter 3 2 element of the matrix: 8
Enter 3 3 element of the matrix: 9
1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 9.00
3.00
2.00
8.00
1.00
6.00
15.00
4.00
12.00
7.00
Maximum sum is equal to 3.00, at line 1
Minimum sum is equal to 3.00, at line 1
Press any key to continue
它不仅要使整个线路赚取一些额外的总和。有任何建议吗?
未经测试,并从我的头顶:
int n;
double A[n][n]
for(int offset = -n+1; offset < n; ++offset) {
double sum = 0;
for(int i = 0; i < n-std::abs(offset); ++i) {
if(offset <= 0) {
sum += A[i][i-offset];
else {
sum += A[i+offset][i];
}
}
std::cout << sum << std::endl;
}
对于负偏移,这会打印上部平行对角线的总和,为正偏移下部平行对角线的总和。第一个循环可以平行于平行,打印语句是唯一关键的部分。
对于那些对角线,它认为z的j = i z,取决于对角线,从 - (height-1(到(width-1(。
这将导致以下算法(解决方案数组能够处理负指数 - 您必须通过某种偏移来更改它(:
Array<R> diagonalSums (Matrix<R> m)
initialize Array<R> solution in according size with all entries initialized to zero
for each cell i,j in m:
find z so that j = i + z (z = j - i)
solution[z] += m(i,j)
return solution
我认为您对偏移做了类似的事情,但是您尝试找到一种从z到属于该Z的总和的方法,这仅是不必要的混淆,至少在您要计算所有总和时无论如何(如果只需要一个款项,您的方式会更好(。我的方法只是越过所有单元格,然后将其添加在同一地点。
我使用了一个具有负数索引的数组,为了提高可读性,我建议您也这样做,那就是创建一个可以做到这一点的类。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 我必须计算方阵的对角线元素之和的差值
- 矩阵c++的对角线元素的和
- 返回C 中2D阵列的对角线元素总和
- 在矩阵中找到与主对角线平行的元素
- 如何对主对角线上方的 2D 数组中的元素进行排序
- 从二维数组中给定的索引中求对角线元素的和
- MPI_Scatter,散射对角线元素
- 如何显示非对角线二维阵列元素
- C++:以对角线方式处理2d数组元素