Есть много разных способов объяснить матричное умножение. Я буду придерживаться одной фигуры, так как считаю, что большинство людей здесь знакомы с ней (и эта цифра очень наглядна). Если вам нужна более подробная информация, я предлагаю вам посетить статью в Википедии или пояснение к 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
: вы должны избегать громоздких форматов ввода / вывода , то я хотел бы отметить, что форматы ввода и вывода очень гибкие. Тот факт, что вы не можете использовать *
и +
для продуктов и сумм, может усложнить использование простого встроенного, но я не считаю это отрицательным моментом.