как умножить двумерный массив, он же матрица

Я хочу знать, как умножать 2D-массивы (матрицы) и отображать их в виде матрицы.

Текущий выход

1 1 1
1 1 1
1 1 1

что не является правильным результатом.

Код ниже:

    static void Main(string[] args)
    {
        int[,] metrix1 = new int[3, 3] { { 2, 0, 2 }, { 0, 1, 2 }, { 1, 2, 1 } };
        int[,] metrix2 = new int[3, 3] { { 1, 1, 1 }, { 0, 1, 0 }, { 0, 0, 1 } };
        int[,] result = new int[3, 3];

        int m1 =0;
        int m2 =0;

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                m1 = metrix1[i, j];

            }
        }

        // metrix 2
            for (int y = 0; y < 3; y++)
            {
                for (int z = 0; z < 3; z++)
                {
                    m2 = metrix2[y, z];
                }
            }
            //m

                for (int a = 0; a < 3; a++)
                    {

                        for (int b = 0; b < 3; b++)
                        {
                        result[a, b] = m1 *m2;
                        Console.Write(result[a, b] );

                        }Console.WriteLine();
                }Console.ReadLine();

                }
            }
        }

person user7201966    schedule 23.11.2016    source источник
comment
используйте только два цикла for   -  person Mahi    schedule 23.11.2016
comment
result[a, b] = m1 *m2; устанавливает каждый элемент result на то, что в m1 раз больше, чем в m2. m1 и m2 оба являются 1, потому что это самый последний элемент в обоих ваших массивах. Посмотрите на свой код в строке //m, в этот момент в вашем коде вы выполнили два набора двойных циклов for до завершения, и последняя итерация первого набора назначена 1 на m1, а последняя итерация второго набора назначена 1 до m2, затем вы проходите и назначаете 1*1 каждому элементу result. P.s. Пожалуйста, соблюдайте правильную орфографию и грамматику, когда задаете вопрос.   -  person Quantic    schedule 23.11.2016


Ответы (1)


Вы неправильно к этому подходите.

for (int y = 0; y < 3; y++)
        {
            for (int z = 0; z < 3; z++)
            {
                m2 = metrix2[y, z];
            }
        }

После этого m2 будет содержать нижнее правое значение массива (matrix[2, 2]). Вы буквально умножаете одно и то же значение снова и снова для своего умножения. Вам нужно поместить все это в один цикл for.

Кроме того, это неправильный способ умножения матриц. Начнем с того, что ваш код будет работать только для матрицы 3x3; у вас могут быть не только матрицы других размеров (4x4, 5x5 и т. д.), матрицы даже не обязательно должны быть квадратными, чтобы иметь возможность их умножать (при условии, что количество столбцов в единице равно количеству строк в матрице). Другой). Даже если обе они являются матрицами 3x3, вычисление все равно будет неверным. В Википедии есть несколько хороших примеров правильного способа сделать это.

2 0 2   1 1 1   (2*1)+(0*0)+(2*0)  (2*1)+(0*1)+(2*0) ...  
0 1 2 x 0 1 0 = (0*1)+(1*0)+(2*0)  (0*1)(1*1)(2*0) ...
1 2 1   0 0 1   ..
person EJoshuaS - Reinstate Monica    schedule 23.11.2016