Есть много разных способов объяснить матричное умножение. Я буду придерживаться одной фигуры, так как считаю, что большинство людей здесь знакомы с ней (и эта цифра очень наглядна). Если вам нужна более подробная информация, я предлагаю вам посетить статью в Википедии или пояснение к WolframMathWorld .
Простое объяснение:
Предположим, у вас есть две матрицы, A и B , где A - 3 на 2, а B - 2 на 3. Если вы выполните умножение матриц на эти матрицы, либо AB , либо BA, вы получите следующие результаты:
Вызов:
Реализуйте умножение символьных матриц на вашем языке. В качестве входных данных вы должны взять две матрицы, где каждый элемент в матрицах представлен непробельным символом ASCII (кодовые точки 33-126). Вы должны вывести произведение этих матриц.
Правила относительно вывода:
Произведение двух записей не должно иметь никаких символов между ними. Это ab, не a*b, a·b, times(a,b)или что - то подобное. Это aaне так a^2.
Сумма терминов должна иметь пробел (кодовая точка 32 ASCII) между ними. Это a b, не a+b, plus(a,b)или что - то подобное.
Обоснование этих двух правил таково: все символы, не являющиеся пробелами, допускаются в качестве символов в матрицах, поэтому их использование в качестве математических символов будет беспорядочным. Итак, что вы могли бы нормально написать как a*b+c*dбудет ab cd.
Вы можете выбрать порядок условий. ab cd, dc abиcd ba математически говоря то же самое, так что вы можете выбрать порядок здесь. Порядок не обязательно должен быть последовательным, если он математически правильный.
Правила относительно матричного форматирования:
Матрица может быть введена в любом формате, который вам нравится, кроме одной строки без разделителей между строками (это потому, что выходные данные будут полностью испорчены). Обе матрицы должны быть введены в одном формате. Все приведенные ниже примеры являются допустимыми способами ввода и вывода матрицы.
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
Я знаю, что это допускает множество форматов, которые будут выглядеть беспорядочно, но проблема заключается в умножении матриц, а не в форматировании вывода.
Основные правила:
- Вы можете принять верный ввод. Умножение матриц всегда будет возможно с заданными размерами.
- Там будет только две матрицы.
- Вы можете предположить, что матрицы не пустые
- Встроенные функции принимаются (но, вероятно, немного громоздко из-за требований к форматированию).
- Вы можете, конечно, использовать escape-символы на входе, если это необходимо (
\'вместо'). - Любой стандартный метод ввода и вывода в порядке .
Тестовые случаи:
Две входные матрицы показаны пустой строкой между ними. Вывод отображается после Output:. Когда есть две выходные матрицы, это просто показать другие выходные данные, которые будут приняты.
Тестовый пример № 1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
Тестовый пример № 2
Inputs:
[a, b]
[1, 4]
[y, {]
[%, 4, 1]
[a, b, c]
Output:
[a% ba, a4 bb, a1 bc]
[1% 4a, 14 4b, 11 4c]
[y% {a, y4 {b, y1 {c]
Тестовый пример № 3:
Inputs:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 1, 2, 3]
[4, 5, 6, 7]
[a]
[b]
[c]
[d]
Output:
[1a 2b 3c 4d]
[5a 6b 7c 8d]
[9a 1b 2c 3d]
[4a 5b 6c 7d]
[d4 c3 b2 a1] <-- Also OK
[d8 c7 b6 a5]
[1b 9a c2 3d]
[a4 b5 d7 6c]
Если ваш ответ на правила о требовании ab cdвместо a*b+c*d: вы должны избегать громоздких форматов ввода / вывода , то я хотел бы отметить, что форматы ввода и вывода очень гибкие. Тот факт, что вы не можете использовать *и +для продуктов и сумм, может усложнить использование простого встроенного, но я не считаю это отрицательным моментом.
