C 从矩阵的行中减去一个值
我有以下矩阵: 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之后,我将代码更改为: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
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/aint
的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