Учитывая вектор А:
+A←3 4⍴1 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0
1 0 0 0
0 1 0 1
разбить его на составные матрицы следующим образом:
+(⍴A)∘⍴¨⊂[2](,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
Как это работает
Сначала назначить количество 1s к B:
B←+/,A ⍝ 5
Создать единичную матрицу, как описано в этом посте: The most idiomatic way of creating identity matrix in APL:
B B⍴1,(B←+/,A)⍴0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
RAVEL исходной матрицы:
,A ⍝ 1 0 1 0 1 0 0 0 0 1 0 1
Используйте расколотую матрицу для расширения матрицы идентичности.Это создает матрицу, где каждая строка представляет собой распущенной вид матриц компонентов:
+(,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1
Преобразование этой матрицы в вектор строк:
+⊂[2](,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
Используя оригинальную форму (⍴A)
, создать конечные матрицы:
(⍴A)∘⍴¨⊂[2](,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
Очень хорошее решение! Мне нравится этот, потому что он просто перестраивает 1 и 0, а кроме числа 1 не требует целых чисел или индексов.Я думал, что должен быть какой-то способ сделать это таким образом и играть с расширением, но генерация матрицы идентичности мне не пришла. Очень приятно! –
@PaulMansour - Спасибо, Пол! Мне тоже понравилось ваше решение, но я немного в тупике от него, потому что я получаю ошибку валентности с '↓ (v/i) ∘. = I'. Не должно быть аргумента слева от этого? –
Монадическая стрелка вниз известна как «раскол» и делает то же самое, что и [2], превращая матрицу в вектор векторов. Может быть недоступен во всех реализациях APL. –