воскресенье, 20 января 2013 г.

Умножение матриц

Умножение матриц - одна из основных операций над матрицами. Принцип умножения матриц хорошо описан в Википедии

В двумерном массиве arr[m][n], по соглашению, первое значение - количество строк, второе - столбцов.

Применение умножения матриц можно найти, например,при программировании поведения объектов в трехмерном пространстве.


public class MatrixMultiplection {
    public static void main(String[] args) {
        int[][] mA = 
            {{33,34,12},
             {33,19,10},
             {12,14,17},
             {84,24,51},
             {43,71,21}};
        
        int[][] mB = 
            {{10,11,34,55},
             {33,45,17,81},
             {45,63,12,16}};

        
        int m = mA.length;
        int n = mB[0].length;
        int o = mB.length;
        int[][] res = new int[m][n];
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < o; k++) {
                    res[i][j] += mA[i][k] * mB[k][j]; 
                }
            }
        }
        
        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j < res[0].length; j++) {
                System.out.format("%6d ", res[i][j]);
            }
            System.out.println();
        }
    }
}
/**
  Output:   
  1992   2649   1844   4761 
  1407   1848   1565   3514 
  1347   1833    850   2066 
  3927   5217   3876   7380 
  3718   4991   2921   8452
 */

Данный алгоритм имеет сложность O(n3). Алгоритм Копперсмита — Винограда может делать это за O(n2.3727).

9 комментариев:

  1. это не верное решение, в ответе количество строк матрицы "А" всегда равно количеству строк матрицы "В".
    http://www.youtube.com/watch?v=llwuoLzPbdE

    ОтветитьУдалить
    Ответы
    1. Вы немного ошиблись. В ответе количество строк матрицы А должно быть равно количеству столбцов матрицы В. В данном случае в роли матрицы А у меня выступает ma2, а в роли B, соответственно ma1

      Удалить
  2. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  3. Перемножать можно матрицы А и В, если количество столбцов матрицы А равно количеству строк матрицы В. В данном примере размерность ma1 - 3 на 4, ma2 - 5 на 3, 4 не равно 5. Ошибка уже при инициализации матриц.
    Размер результирующей матрицы, как верно было замечено, это количество строк матрицы А на количество столбцов матрицы В. Вторая ошибка в строке " int[][] res = new int[m][q];" :
    m рассчитано как количество столбцов ma1, a q - как количество строк ma1.
    Должно быть:
    int a= ma1.length;
    int b= ma2[0].length;
    int[][] res = new int[a][b];

    ОтветитьУдалить
  4. Бичара тупая, тут ниправильна

    ОтветитьУдалить
  5. Привет всем, я Иисус Маккинни из Техаса, и я просто хочу сказать очень громкое спасибо финансовым кредитным службам от Бенджамина Ли за их искренность, открытость, прозрачность, правдивость, любовь и поддержку во время и после получения от них ссуд. Я через многое прошел, и время не позволяет мне рассказать обо всем, через что я прошел онлайн в гостях или получить ссуду, чтобы получить дом здесь, в США, но Бог ответил на мои молитвы через поддержку и любовь со стороны Бенджамина Ли, который обнял меня и понял меня, несмотря на мои первоначальные сомнения и несерьезность, и с его добрым сердцем и любовью, я теперь являюсь владельцем дома через его 2 процентных ссудных фонда, и я клянусь распространить эту новость, а также рассказать миру, что все еще есть настоящие и Есть несколько хороших онлайн-кредитных компаний, которые могут помочь, а также оживить сухую кость. не упустите возможность послушать и прочитать это свидетельство, потому что это настоящий жизненный опыт, и любой, кто нуждается в таком изменении, не должен колебаться или сомневаться в этом потому что я доказал и клянусь богом на небесах, что эта история реальна, а также история моего опыта с ними. свяжитесь с ними сегодня. Текст в WhatsApp: (+1 989-394-3740) электронная почта: 247officedept@gmail.com

    ОтветитьУдалить