В приведенных ниже примерах, A
и B
будет 2-на-2 матрицы, и матрицы являются одним индексированные.
Кронекера продукт имеет следующие свойства:
A⊗B = A(1,1)*B A(1,2)*B
A(2,1)*B A(2,2)*B
= A(1,1)*B(1,1) A(1,1)*B(1,2) A(1,2)*B(1,1) A(1,2)*B(1,2)
A(1,1)*B(2,1) A(1,1)*B(2,2) A(1,2)*B(2,1) A(1,2)*B(2,2)
A(2,1)*B(1,1) A(2,1)*B(1,2) A(2,2)*B(1,1) A(2,2)*B(1,2)
A(2,2)*B(2,1) A(2,2)*B(1,2) A(2,2)*B(2,1) A(2,2)*B(2,2)
Кронекера сумма обладает следующими свойствами:
A⊕B = A⊗Ib + Ia⊗B
Ia
и Ib
являются единичными матрицами с размерами A
и B
соответственно. A
и B
являются квадратными матрицами. Обратите внимание, что A
и B
могут быть разных размеров.
A⊕B = A(1,1)+B(1,1) B(1,2) A(1,2) 0
B(2,1) A(1,1)+B(2,2) 0 A(1,2)
A(2,1) 0 A(2,2)+B(1,1) B(1,2)
0 A(2,1) B(2,1) A(2,2)+B(2,2)
Учитывая две квадратные матрицы, A
и B
вычислить сумму Кронекера двух матриц.
- Размер матриц будет как минимум
2-by-2
. Максимальный размер будет соответствовать тому, что ваш компьютер / язык может обрабатывать по умолчанию, но минимальный5-by-5
ввод (5 МБ). - Все входные значения будут неотрицательными целыми числами
- Встроенные функции, которые вычисляют сумму Кронекера или произведения Кронекера, не допускаются
- В целом: стандартные правила, касающиеся формата ввода / вывода, программы и функций, лазеек и т. Д.
Тестовые случаи:
A =
1 2
3 4
B =
5 10
7 9
A⊕B =
6 10 2 0
7 10 0 2
3 0 9 10
0 3 7 13
----
A =
28 83 96
5 70 4
10 32 44
B =
39 19 65
77 49 71
80 45 76
A⊕B =
67 19 65 83 0 0 96 0 0
77 77 71 0 83 0 0 96 0
80 45 104 0 0 83 0 0 96
5 0 0 109 19 65 4 0 0
0 5 0 77 119 71 0 4 0
0 0 5 80 45 146 0 0 4
10 0 0 32 0 0 83 19 65
0 10 0 0 32 0 77 93 71
0 0 10 0 0 32 80 45 120
----
A =
76 57 54
76 8 78
39 6 94
B =
59 92
55 29
A⊕B =
135 92 57 0 54 0
55 105 0 57 0 54
76 0 67 92 78 0
0 76 55 37 0 78
39 0 6 0 153 92
0 39 0 6 55 123
code-golf
arithmetic
linear-algebra
matrix
Стьюи Гриффин
источник
источник
CJam,
403938 байтФормат ввода представляет собой список, содержащий
A
иB
как 2D списки, напримерВыходной формат представляет собой один 2D-список в стиле CJam.
Тестирование. (С более читаемым форматом вывода.)
объяснение
Этот код является упражнением в составных (или инфиксных) операторах. Они обычно полезны для манипулирования массивами, но эта проблема усугубляет необходимость в них. Вот краткий обзор:
f
ожидает список и что-то еще в стеке и отображает следующий двоичный оператор над списком, передавая другой элемент в качестве второго аргумента. Например[1 2 3] 2 f*
и то и2 [1 2 3] f*
другое дают[2 4 6]
. Если оба элемента являются списками, первый сопоставляется, а второй используется для каррирования бинарного оператора.:
имеет два использования: если оператор, следующий за ним, унарный, это простая карта. Например ,[1 0 -1 4 -3] :z
это[1 0 1 4 3]
, гдеz
получает модуль числа. Если оператор, следующий за ним, является двоичным, то вместо этого он сложит оператор. Например,[1 2 3 4] :+
есть10
..
векторизует бинарный оператор. Он ожидает два списка в качестве аргументов и применяет оператор к соответствующим парам. Например[1 2 3] [5 7 11] .*
дает[5 14 33]
.Обратите внимание, что
:
сам по себе всегда унарный оператор, тогда какf
и.
сами всегда бинарные операторы. Они могут быть произвольно вложены (при условии, что они имеют правильные арты). И это то, что мы будем делать ...источник
:ffff*
может быть самым длинным (соединение) оператор я когда - либо использовал в CJam ... Для один более байт один может идти даже безумнее , хотя:9Yb2/Q~f.{\{,,_ff=}&}::ffff*:::.+::~:..+p
(и да, добавим объяснение , когда я закончу играть в гольф).J -
383331 байтПрименение
источник
(2 2 $ 1 2 3 4) f (2 2 $ 1 1 1 1)
возникнет ошибка домена.? 4 4 $ 100
. Я не уверен, есть ли способ использовать композицию диадыx f&g y = (g x) f (g y)
или что-то еще здесь.Юлия,
60595856 байтПопробуйте онлайн!
Как это работает
Для матриц A и B ,
map(a->a*B,A')
вычисляет произведение Кронекера A⊗B .Результат является вектором матричных блоков с размерами B .
Мы должны транспонировать A (с
'
), так как матрицы хранятся в главном порядке столбцов.Поскольку побитовое НЕ с дополнением до двух удовлетворяет тождеству ~ n = - (n + 1) для всех целых чисел n , имеем - ~ -n = - (~ (-n)) = - ((- n) + 1) = 1 - n , поэтому - ~ -0 = 1 и - ~ -1 = 0 .
Таким образом, анонимная функция
i->map(a->a*B^i,A'^-~-i)
применяет приведенную выше карту к B⁰ (единичная матрица с размерами B ) и A¹ = A, когда i = 0 , и к B¹ и A⁰, когда i = 1 .sum(i->map(a->a*B^i,A'^-~-i),0:1)
Суммирует более {0,1} с помощью указанной выше анонимной функции, вычисляя сумму Кронекера A⊕B как A¹⊗B⁰ + A⁰⊗B¹ .Результат является вектором матричных блоков с размерами B .
sum(A^0)
вычисляет сумму всех элементов матрицы идентичности А размеров «s. Для матрицы A n × n это дает n .Наконец,
hvcat(sum(A^0),sum(i->map(a->a*B^i,A'^-~-i),0:1)...)
объединяет матричные блоки, которые образуют A⊕B .С первым аргументом п ,
hvcat
сцепляет п матричных блоков по горизонтали, и в результате (больше) блоков по вертикали.источник
Руби, 102
В тестовой программе
Требуется два 2D-массива в качестве входных данных и возвращает 2D-массив.
Вероятно, есть лучшие способы сделать это: использовать функцию, чтобы избежать повторения; используя одну петлю и распечатывая вывод. Посмотрим на них позже.
источник
JavaScript (ES6), 109
Построен на ответ на другой вызов
Тестовое задание
источник