矩阵有啥问题?

Posted

技术标签:

【中文标题】矩阵有啥问题?【英文标题】:What's wrong with the matrix?矩阵有什么问题? 【发布时间】:2017-11-23 15:00:47 【问题描述】:

这段代码有什么问题? 我的任务是:创建一个大小为 9x9 的整数方阵。用随机数填充矩阵。相对于垂直轴对称地显示主对角线和侧对角线。预期结果的例子在这里:matrix

Matrix :

20      20      76      65      93      76      16      2       85

6       87      78      43      48      81      71      90      38

10      12      35      77      48      88      24      53      7 

12      66      51      35      74      7       30      22      49

58      14      71      46      68      68      10      81      51

98      16      74      47      64      25      17      30      37

2       44      44      74      34      54      86      73      28

85      4       57      75      18      28      51      76      2 

35      17      53      76      15      91      83      85      72

The main and side diagonal:

85      20      76      65      93      76      16      2       20

6       90      78      43      48      81      71      87      38

10      12      24      77      48      88      35      53      7 

12      66      51      7       74      35      30      22      49

58      14      71      46      68      68      10      81      51

98      16      74      25      64      47      17      30      37

2       44      86      74      34      54      44      73      28

85      76      57      75      18      29      51      4       2 

72      17      53      76      15      91      83      85      35

但实际上程序只打印带有随机数的主矩阵,然后停止。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <Windows.h>
int main()

    int a = 9;
    int matrix[a][a];
    int temp;
    int i, j, n;
    srand((unsigned)time(NULL));

    printf("Matrix : \n\n");
    for (i = 0; i < a; ++i) 
        for (j = 0; j < a; ++j) 
            matrix[i][j] = rand() % 100;
            printf("%d\t", matrix[i][j]);
        
        printf("\n\n");
    
    printf("The main and side diagonal:\n\n");
    for (i = 0; i < a; ++i) 
        temp = matrix[i][i];
        matrix[i][i] = matrix[i][(a - 1) - i];
        matrix[i][(a - 1) - i] = temp;
    
    for (i = 0; i < a; ++i) 
        for (j = 0; j < a; ++j) 
            printf("Result:", matrix[i][j]);
            printf("\n\n\n");
            system("pause");
            return 0;
        
    

【问题讨论】:

代码的预期和实际结果是什么? 编辑您的问题,并附上导致您认为存在问题的原因。运行代码时出现错误消息、错误输出、成群尖叫的外星人从天而降,其他? 图像应作为“代码”嵌入问题中。它只是两个带有标题线的 9x9 矩阵的转储。看起来这些行是双倍行距的(一行数字,一行空白)。我不知道什么是“主对角矩阵和侧对角矩阵”——Google 也没有用三个或更少的音节来告诉我。 【参考方案1】:

你正在返回你不应该去的地方。 (在计算中间)。完成 for 循环后,您应该返回。

for (i = 0; i < a; ++i) 
        for (j = 0; j < a; ++j) 
            printf("Result:", matrix[i][j]); <--- Not printing element
            printf("\n\n\n");
            system("pause");
            return 0; <-----
        
    

应该是

for (i = 0; i < a; ++i) 
        for (j = 0; j < a; ++j) 
            printf("Result: %d ", matrix[i][j]); <----You forgot the
                                                //format specifier
            printf("\n\n\n");
            system("pause");

        
    
  return 0;<-----

这样的缩进会妨碍可读性。您从中实现了错误的逻辑。


OP 要求它在打印“结果”后停止,这是因为您忘记将格式说明符放入代码中。这就是为什么没有打印任何元素的原因。

Op 想要打印 相对于垂直轴对称的主对角线和侧对角线

现在这就是打印部分的全部内容了。

现在我们必须找到一种方法来区分哪个是对角元素,哪个不是。

令人惊讶的是,编写先前交换逻辑的人应该知道答案。 (虽然不清楚为什么 OP 换了它)。

现在所有元素matrix[p][q] 将来自p=qp+q=a-1 的任一对角线。 (注意matrix是方阵)。


但是 OP 的意思是打印矩阵


for (i = 0; i < a; ++i) 
        if( i == 0) printf("The main and side diagonal : \n");
        for (j = 0; j < a; ++j) 
            printf("%d\t", matrix[i][j]);
          
        printf("\n");
    

【讨论】:

谢谢,我做到了,但问题仍然存在……不明白问题出在哪里。 @ВасилийПупкин.: 有什么问题吗?你想生成随机矩阵并打印出来吗? 我想打印随机矩阵和边(辅助)矩阵相对于垂直轴对角线对称。但是程序会打印随机矩阵和字符串“主对角线和侧对角线:”和“结果:”,然后停止。 @ВасилийПупкин.: 所以你想像这样打印对角线a[0][0] a[0][2] a[1][1] a[1][1] a[0][2] a[2][2]??? @ВасилийПупкин.:欢迎使用 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here? 和What do I do when someone answers my question?【参考方案2】:

使用函数。您打印矩阵两次;你应该有一个函数来打印你调用两次的矩阵。

使用这样的函数,您就不会在代码的末尾犯错误。例如,您可以这样使用:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static void print_matrix(const char *tag, int size, int matrix[size][size])

    printf("%s (%dx%d):\n\n", tag, size, size);
    for (int i = 0; i < size; ++i)
    
        const char *pad = "";
        for (int j = 0; j < size; ++j)
        
            printf("%s%-2d", pad, matrix[i][j]);
            pad = "      ";
        
        printf("\n\n");
    


int main(int argc, char **argv)

    unsigned seed = time(0);
    int a = 9;
    int matrix[a][a];

    if (argc == 2)
        seed = atoi(argv[1]);
    srand(seed);
    printf("Seed: %u\n", seed);

    for (int i = 0; i < a; ++i)
    
        for (int j = 0; j < a; ++j)
            matrix[i][j] = rand() % 100;
    

    print_matrix("Matrix", a, matrix);

    for (int i = 0, j = a - 1; i < a; ++i, --j)
    
        int temp = matrix[i][i];
        matrix[i][i] = matrix[i][j];
        matrix[i][j] = temp;
    

    print_matrix("The main and side diagonal", a, matrix);

    return 0;

代码报告它使用的种子;这允许您通过指定要用作命令行参数的种子来重现任何运行。

示例输出:

Seed: 1511470282
Matrix (9x9):

11      39      3       88      98      63      75      81      76

93      9       60      22      45      50      46      58      65

13      99      25      43      14      57      44      70      65

30      57      55      0       37      84      47      49      40

60      28      46      1       96      78      33      20      9 

93      61      11      38      84      16      91      26      15

43      85      66      72      85      39      96      45      45

45      25      33      3       78      90      61      65      62

88      84      56      34      74      8       78      57      74

The main and side diagonal (9x9):

76      39      3       88      98      63      75      81      11

93      58      60      22      45      50      46      9       65

13      99      44      43      14      57      25      70      65

30      57      55      84      37      0       47      49      40

60      28      46      1       96      78      33      20      9 

93      61      11      16      84      38      91      26      15

43      85      96      72      85      39      66      45      45

45      65      33      3       78      90      61      25      62

74      84      56      34      74      8       78      57      88

如果不明显,交换过程会交换第一行的第一个和最后一个元素,第二行中的第二个和最后一个元素,依此类推,形成交换元素的 X。

【讨论】:

以上是关于矩阵有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

阈值对矩阵配置文件有啥作用?

有啥通用方法可以从矩阵中删除 NaN?

向量、矩阵和数组数据类型有啥区别?

混淆矩阵和列联表有啥区别?

给定相机参数,我如何找到从视图空间到像素坐标的转换?我的矩阵有啥问题?

在标量矩阵加法中使用 vaddss 而不是 adds 有啥好处?