Умножение матриц - одна из основных операций над матрицами. Принцип умножения матриц хорошо описан в Википедии
В двумерном массиве 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).
это не верное решение, в ответе количество строк матрицы "А" всегда равно количеству строк матрицы "В".
ОтветитьУдалитьhttp://www.youtube.com/watch?v=llwuoLzPbdE
Вы немного ошиблись. В ответе количество строк матрицы А должно быть равно количеству столбцов матрицы В. В данном случае в роли матрицы А у меня выступает ma2, а в роли B, соответственно ma1
УдалитьБлагодарю за код)
ОтветитьУдалитьЭтот комментарий был удален администратором блога.
ОтветитьУдалитьПеремножать можно матрицы А и В, если количество столбцов матрицы А равно количеству строк матрицы В. В данном примере размерность 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];
Спасибо. Вы правы. Исправил
Удалитьлалак
УдалитьБичара тупая, тут ниправильна
ОтветитьУдалитьПривет всем, я Иисус Маккинни из Техаса, и я просто хочу сказать очень громкое спасибо финансовым кредитным службам от Бенджамина Ли за их искренность, открытость, прозрачность, правдивость, любовь и поддержку во время и после получения от них ссуд. Я через многое прошел, и время не позволяет мне рассказать обо всем, через что я прошел онлайн в гостях или получить ссуду, чтобы получить дом здесь, в США, но Бог ответил на мои молитвы через поддержку и любовь со стороны Бенджамина Ли, который обнял меня и понял меня, несмотря на мои первоначальные сомнения и несерьезность, и с его добрым сердцем и любовью, я теперь являюсь владельцем дома через его 2 процентных ссудных фонда, и я клянусь распространить эту новость, а также рассказать миру, что все еще есть настоящие и Есть несколько хороших онлайн-кредитных компаний, которые могут помочь, а также оживить сухую кость. не упустите возможность послушать и прочитать это свидетельство, потому что это настоящий жизненный опыт, и любой, кто нуждается в таком изменении, не должен колебаться или сомневаться в этом потому что я доказал и клянусь богом на небесах, что эта история реальна, а также история моего опыта с ними. свяжитесь с ними сегодня. Текст в WhatsApp: (+1 989-394-3740) электронная почта: 247officedept@gmail.com
ОтветитьУдалить