Дайте мне знать, если какой-либо из следующих кодов неясен, так как я затем уточню, как он работает.
Точное соответствие
My Репозиторий Dyalog APL Extended содержит функцию покрытия для ⍴
, которая делает именно это, но обобщается на массивы всех рангов.Это позволяет вам использовать ¯1
, чтобы указать, что длина конкретного измерения должна автоматически рассчитываться для точного соответствия данным.Код выглядит следующим образом:
⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺
, где ⍺
- вектор формы, а ⍵
- данные. Попробуйте!
(|(×/⍴⍵)÷×/⍺)
вычисляет длину длины, отмеченной ¯1
@(¯1=⊢)
, исправляет ⍺
с этим значением в позициях, обозначенных маской (¯1=⊢)⍺
(см. train )
⍵⍴⍨
изменяет форму ⍵
с этой формой (вместо того, чтобы преобразовывать ее в форму ⍵
)
Если вам просто нужна матрица, выполните следующеезадание в любом APL, которое вы можете использовать:
(((×/⍴⍵)÷⍺),⍺)⍴⍵
, где ⍺
- количество строк, а ⍵
- данные. Попробуйте!
Заполнение
Если вы знаете, что хотите дополнить последний ряд (в отличие от ошибки или пропуска неполного завершающего ряда), у вас в основном есть три варианта:
Повторное использование элементов с начала данных
Пэд с элементом-прототипом
Накладка с пользовательским элементом заполнения
1.Перерабатывать элементы с начала данных
Это легко, потому что это то, что ⍴
делает по умолчанию, так что вам просто нужно округлить (⌈
) количество строк:
Общее решение Dyalog: ⍵⍴⍨(<strong>⌈</strong>|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺
Попробуйте!
Матрица только для всех APL: ((<strong>⌈</strong>(×/⍴⍵)÷⍺),⍺)⍴⍵
Попробуйте!
2.Площадка с элементом-прототипом
. Для этого мы берем произведение вычисленного вектора формы и используем его, чтобы «перебрать» (↑
) элементы из округленных (,
) данных, прежде чем использовать вектор формы.фактически изменить:
Общее решение Dyalog: ((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺)<strong>{⍺⍴(×/⍺)↑,⍵}</strong>⍵
Попробуйте!
Marix только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺)<strong>{⍺⍴(×/⍺)↑,⍵}</strong>⍵
Попробуйте!
3.Пэд с пользовательским элементом заполнения
Мы можем найти, сколько элементов заполнения (я буду использовать ¯3
) нам нужно, вычитая количество заданных элементов данных из необходимого числа.Затем мы объединяем (,
) столько заполненных элементов с округленными (,
) данными перед изменением формы:
Общее решение Dyalog: ((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺)<strong>{⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}</strong>⍵
Попробуйте!
Матрица только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺)<strong>{⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}</strong>⍵
Попробуйте!