Вычитание значения из строк матрицы - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть следующая матрица:

1 4 5

5 7 6

5 8 8

Я хочу найти минимальное значениестрока 1 и вычтите из всех значений одной и той же строки.То же самое для строк 2 и 3. Минимальное значение строки 1 равно 1, строка 2 равно 5 и строка 3 равно 5. Поэтому я вычитаю 1 из всех значений строки 1, вычитаю 5 из всех значений в строке 2 и вычитаю 5из всех значений в строке 3.

0 3 4

0 2 1

0 3 3

Моя матрица называется "a":

min = a[0][0]  \\\ min = minimum value

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

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

        }

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

            a[k][l] = a[k][l] - min;

        }
        min = a[k+1][0];

    }

Для k = 0 значение a [k + 1] [0] = 5 меняется на 4. Почему это так?

РЕДАКТИРОВАТЬ: Я объявил массив как:

a[0][0] = 1;
a[0][1] = 4;
a[0][2] = 5;
a[1][0] = 5;
a[1][1] = 7;
a[1][2] = 6;
a[2][0] = 5;
a[2][1] = 8;
a[2][2] = 8;

Следуя за Крезимиром, я изменил код на:

  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;
    }

}

Для печати матрицы:

  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

Когда k = 0, первая строка изменяется правильно, а остальная часть остается такой же, как и должна, а когда k = 1, все строки изменяются неправильно, как указано выше.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Если вы хотите найти минимум для каждой строки, вам нужно инициализировать его для каждой строки, а не только один раз.

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

Пока вы искали только минимум.

0 голосов
/ 02 декабря 2018

При приближении к любому биту кодирования это обычно помогает разбить ваши задачи по кодированию на ряд отдельных этапов, которые затем обеспечивают план действий, который необходимо соблюдать при начале фактического кодирования.Вы можете напечатать шаги в отдельном окне редактора (или что я считаю столь же полезным, это лист бумаги и карандаша размером 8 1/2 x 11).

Продумайте, что должен делать ваш код, и напишитеэто вниз, например,

  1. цикл по всем строкам матрицы (a / k / a 2D-массив int);
  2. цикл по всем значениям столбца, чтобы найти минимальное значениев каждом ряду;и, наконец,
  3. перебираем все значения столбцов (снова), вычитая минимум из каждого значения.

Вам не нужно делать его идеальным в первый раз, теперь посмотрите снова нашаги, которые вы написали, и определите, есть ли какие-либо ограничения , которые вы должны наложить.

(Здесь, да, вы должны определить минимум, изучая каждое значение в строке, прежде чем вы сможете начать вычитать минимум из каждого значения - это требует как минимум двух циклов над значениями столбца. Кроме того, вы должнытакже сбросьте или повторно инициализируйте вашу переменную min, чтобы она содержала минимум для текущей строки, а не минимум из последней строки, которая оказалась меньше этой. Используйте требование повторной инициализации, чтобы сделать логическуювыбор области действия, в которой должна быть объявлена ​​каждая переменная)

Теперь, когда ваши шаги уточнены с учетом всех ограничений, которые вы должны наложить, вы можете логически выложить свой код (имея в виду, что вы всегда должны защищать от чтения или записиза пределами вашего массива и т. д.) Благодаря хорошей схеме вы знаете, что вам понадобится один внешний цикл, который проходит по всем строкам, а затем два внутренних цикла, которые (а) находят минимум и (б) вычитают его извсе значения в этом ряду.Вы можете сделать что-то похожее на:

#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

В этом нет никакой магии, достаточно просто подойти к каждой проблеме всистематический способ.Делая это достаточно часто, с каждым разом становится легче.Обратите внимание на то, где каждая переменная была объявлена ​​(или определена константа), и поймите, почему.Дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 01 декабря 2018

Всякий раз, когда я ищу минимум, я устанавливаю min в положительную бесконечность (ничто не может быть больше этого - вам не нужно это делать, но, на мой взгляд, это делает код более приятным).

В качестве альтернативы, вы можете использовать min = Math.min(...a[k]); вместо всего первого цикла for (хотя не будет работать в IE).

Также имейте в виду, что индексы изменяются от 0 до2. Также проверьте порядок k и l (в зависимости от того, как вы реализуете строки и столбцы матрицы).

let k, l, min;
let a=[[1, 4, 5],
       [5, 7, 6],
       [5, 8, 8]];

for (k = 0; k < 3; k++) {
    min = +Infinity;
    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;
    }
}

console.log(a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...