Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从矩阵的行中减去一个值_C_Matrix - Fatal编程技术网

C 从矩阵的行中减去一个值

C 从矩阵的行中减去一个值,c,matrix,C,Matrix,我有以下矩阵: 1 4 5 576 5 8 8 我想找到第1行的最小值,然后从同一行的所有值中减去。2号线和3号线也是这样。第1行的最小值为1,第2行的最小值为5,第3行的最小值为5。所以我从第1行的所有值中减去1,从第2行的所有值中减去5,从第3行的所有值中减去5 0 3 4 0 2 1 03 我的矩阵称为“a”: 在Kresimir之后,我将代码更改为: for (k = 0; k < 3; k++) { min = 10000; for (l = 0; l &l

我有以下矩阵:

1 4 5

576

5 8 8

我想找到第1行的最小值,然后从同一行的所有值中减去。2号线和3号线也是这样。第1行的最小值为1,第2行的最小值为5,第3行的最小值为5。所以我从第1行的所有值中减去1,从第2行的所有值中减去5,从第3行的所有值中减去5

0 3 4

0 2 1

03

我的矩阵称为“a”:

在Kresimir之后,我将代码更改为:

  for (k = 0; k < 3; k++) {

    min = 10000;
    for (l = 0; l < 3; l++) {
        if (a[k][l] < min)
            min = a[k][l];                      
    }

    for (l = 0; l < 3; l++) {           
        a[k][l] = a[k][l] - min;
    }

}

当k=0时,第一行被正确地更改,其余的保持不变,当k=1时,所有的行都被错误地更改为上面的行。

每当我寻找最小值时,我将
min
设置为正无穷大(没有比这更大的值了-你不必这样做,但在我看来,这是一个更好的代码)

或者,您可以使用
min=Math.min(…a[k])
而不是整个
for
循环的第一个
(不过在IE上不起作用)

另外,请记住,索引从0到2。另外,检查k和l的顺序(取决于如何实现矩阵的行和列)

设k,l,min;
设a=[[1,4,5],
[5, 7, 6],
[5, 8, 8]];
对于(k=0;k<3;k++){
最小值=+无穷大;
对于(l=0;l<3;l++){
如果(a[k][l]控制台日志(a)如果要找到每行的最小值,则需要为每行初始化它,而不是只初始化一次

for (k = 0; k < 3; k++) {
min = a[k][0];
...
(k=0;k<3;k++)的
{
min=a[k][0];
...

到目前为止,您只是在搜索最小值。

当接近任何编码位时,通常可以将编码任务分解为一系列单独的步骤,然后在开始实际编码时提供路线图。您可以在单独的编辑器窗口中键入步骤,(或者我发现同样有用的是一张8 1/2 x 11的纸和铅笔)

仔细想想你的代码必须做什么,然后写下来,例如

  • 循环矩阵中的所有行(a/k/a
    int
    的2D数组)
  • 循环所有列值以查找每行中的最小值;最后
  • 循环所有列值(再次)从每个值中减去最小值
  • 你不必第一次就把它做得完美,现在再看看你写的步骤,确定是否有任何必须施加的约束

    (在这里,是的,您必须通过检查行中的每个值来确定最小值,然后才能开始从每个值中减去最小值——这需要在列值上至少进行两个循环。此外,您还必须重置或重新初始化
    min
    变量,使其保持当前行的最小值,而不是m恰好小于此值的最后一行。使用重新初始化要求对每个变量应声明的范围进行逻辑选择)

    现在,通过使用必须施加的任何约束对步骤进行优化,您可以在逻辑上布局代码(请记住,您必须始终防止读取或写入超出数组边界的内容,等等)。有了一个良好的大纲,您知道您将需要一个在所有行上循环的外部循环,然后是两个在(a)上循环的内部循环找到最小值,然后(b)从该行中的所有值中减去该值。您可以执行类似的操作:

    #include <stdio.h>
    #include <limits.h>     /* for INT_MAX, INT_MIN */
    
    #define ASZ 3   /* if you need a constant, define one (or more), a size */
    
    int main (void) {
    
        int a[][ASZ] = {{ 1, 4, 5 }, { 5, 7, 6 }, { 5, 8, 8 }};
    
        puts ("Original matrix:");              /* output original matrix */
        for (int row = 0; row < ASZ; row++) {
            for (int col = 0; col < ASZ; col++)
                printf (" %2d", a[row][col]);
            putchar ('\n');
        }
    
        puts ("\nModified matrix:");    /* subtract row-min from each element */
        for (int row = 0; row < ASZ; row++) {       /* loop over rows */
            int min = INT_MAX;                      /* declare min = INT_MAX */
            for (int col = 0; col < ASZ; col++)     /* loop over column vals */
                if (a[row][col] < min)              /* find row-min value */
                    min = a[row][col];
            for (int col = 0; col < ASZ; col++) {   /* loop over column vals */
                a[row][col] -= min;                 /* subtract row-min value */
                printf (" %2d", a[row][col]);       /* output new value */
            }
            putchar ('\n');
        }
    }
    

    它没有什么神奇之处,只是需要以系统的方式处理每个问题。经常这样做,每次都会变得容易。注意每个变量的声明(或常量的定义)并了解原因。如果您有任何进一步的问题,请告诉我。

    min=a[k+1][0]当
    k=2
    您错误地编辑了代码时,
    是未定义的行为。运行我的答案中的锥形片段,输出与您声称的输出完全不同。是的,我运行了,您的输出是正确的。我按字面上的ctrl c和ctrl v控制您的代码,并将最小值更改为10000,我的输出是错误的。我不明白。它正在处理Java但不是在C上。不知道为什么。这是我的代码输出?!a[0][0]=0A[0][1]=3A[0][2]=0A[1][0]=0A[1][1]=3A[1][2]=0A[2][0]=0A[2][2]=3正确的输出是:a[0][0]=0A[0][1]=3A[0][2]=4A[1][0]=0A[1][1][2]=1A2][2]=3,这是我的答案中的代码给出的。对于整数值,常量
    INT_MIN
    INT_MAX
    足以分别设置
    MAX
    MIN
    值的起始范围。事实上,它们是。你也可以设置数组的第一个元素。这都是等价的,是一个问题个人偏好。@Kresimir Nope,将无穷大转换为整数是UB,请参见此处
      for (i = 0; i < 3; i++) {
    
        for (j = 0; j < 3; j++) {
            printf("a[%d][%d] = %d\n", i, j, a[i][j]);
        }
    }
    
    a[0][0] = 0
    a[0][1] = 3
    a[0][2] = 0
    a[1][0] = 0
    a[1][1] = 3
    a[1][2] = 0
    a[2][0] = 0
    a[2][1] = 0
    a[2][2] = 3
    
    for (k = 0; k < 3; k++) {
    min = a[k][0];
    ...
    
    #include <stdio.h>
    #include <limits.h>     /* for INT_MAX, INT_MIN */
    
    #define ASZ 3   /* if you need a constant, define one (or more), a size */
    
    int main (void) {
    
        int a[][ASZ] = {{ 1, 4, 5 }, { 5, 7, 6 }, { 5, 8, 8 }};
    
        puts ("Original matrix:");              /* output original matrix */
        for (int row = 0; row < ASZ; row++) {
            for (int col = 0; col < ASZ; col++)
                printf (" %2d", a[row][col]);
            putchar ('\n');
        }
    
        puts ("\nModified matrix:");    /* subtract row-min from each element */
        for (int row = 0; row < ASZ; row++) {       /* loop over rows */
            int min = INT_MAX;                      /* declare min = INT_MAX */
            for (int col = 0; col < ASZ; col++)     /* loop over column vals */
                if (a[row][col] < min)              /* find row-min value */
                    min = a[row][col];
            for (int col = 0; col < ASZ; col++) {   /* loop over column vals */
                a[row][col] -= min;                 /* subtract row-min value */
                printf (" %2d", a[row][col]);       /* output new value */
            }
            putchar ('\n');
        }
    }
    
    $ ./bin/mtrx_subtract_rowmin
    Original matrix:
      1  4  5
      5  7  6
      5  8  8
    
    Modified matrix:
      0  3  4
      0  2  1
      0  3  3