Тривиальный пример, показывающий структуру:
{190 10 ⍴⍵}{(⍳⍵)}1900
Это "190" необходимо вычислить как ⌈⍴⍵÷10
или, если есть символ, говорящий "упаковать все элементы в массив р и позволить ему иметь столько строк, сколько необходимо". {(⍳⍵)}1900
- это просто замена произвольного кода, который будет генерировать «поток» чисел, и как только они будут разделены на строки, слева будет больше функций.
Проблема заполнения последней строки является следующей, поэтому, если у кого-то есть идея для этого (без увеличения размера кода), не стесняйтесь вмешиваться. Или, может быть, было бы более компактно сделать эту часть первой (если есть простой способ разрезать его при условии, что число точно кратно желаемой необработанной ширине)? В последнем случае ширина строки может быть переменной (ввод, параметр).
В вашем примере есть ненужные фигурные скобки и круглые скобки: 190 10 ⍴ ⍳1900
Сообщите мне, если какой-либо из следующего кода неясен, и я расскажу, как он работает.
Мой репозиторий Расширенный Dyalog APL содержит функция обложки для ⍴
, который делает именно это, но обобщен на массивы всех рангов. Он позволяет использовать ¯1
, чтобы указать, что длина конкретного измерения должна автоматически рассчитываться, чтобы точно соответствовать данным. Код выглядит следующим образом:
⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺
, где ⍺
- вектор формы, а ⍵
- данные. Попробуй!(|(×/⍴⍵)÷×/⍺)
вычисляет длину длины, помеченной ¯1
.
@(¯1=⊢)
изменяет ⍺
этим значением в положениях, указанных маской (¯1=⊢)⍺
(см. поезда) ⍵⍴⍨
преобразует ⍵
в эту форму (а не в форму ⍵
)
Если вам просто нужна матрица, следующее будет работать в любом APL, который вы можете использовать:
(((×/⍴⍵)÷⍺),⍺)⍴⍵
, где ⍺
- количество строк, а ⍵
- данные. Попробуй!
Если вы знаете, что хотите дополнить последнюю строку (в отличие от ошибки или пропуска неполной конечной строки), у вас в основном есть три варианта:
Утилизируйте элементы с самого начала данных
Площадка с элементом прототипа
Пэд с настраиваемым элементом заливки
Это просто, потому что ⍴
делает это по умолчанию, поэтому вам просто нужно округлить (⌈
) количество строк:
Общее решение Dyalog: ⍵⍴⍨(⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺
Попробуй!
Матрица только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺)⍴⍵
Попробуй!
Для этого мы берем произведение вычисленного вектора формы и используем его, чтобы «переместить» (↑
) элементы из разложенных (,
) данных перед тем, как использовать вектор формы для фактического изменения формы:
Общее решение Dyalog: ((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺){⍺⍴(×/⍺)↑,⍵}⍵
Попробуй!
Marix только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺){⍺⍴(×/⍺)↑,⍵}⍵
Попробуй!
Мы можем узнать, сколько элементов заливки (я буду использовать ¯3
) нам нужно, вычтя количество заданных элементов данных из необходимого числа. Затем мы объединяем (,
), что многие элементы заливки с разложенными (,
) данными перед изменением формы:
Общее решение Dyalog: ((⌈|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺){⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}⍵
Попробуй!
Матрица только для всех APL: ((⌈(×/⍴⍵)÷⍺),⍺){⍺⍴(,⍵),((×/⍺)-(×/⍴⍵))⍴¯3}⍵
Попробуй!
Хорошо, вы в основном говорите, что не существует "волшебного" (== без написания колбасы) способа получить это. Я как бы надеялся, что, будучи «языком IBM» APL будет иметь концепцию допустимости значений NULL и толерантности к NULL (null == не знаю, обрабатывать как личность) и что будет «некоторый null», который будет делать то, что вы ¯1 делает - и заполните "нулями", значения по умолчанию ОК лучше (это концепция post SQL, любезно предоставленная C# - потребовалось много времени) :-). На самом деле я думал в терминах «потоковой обработки» - вы вообще не знаете длины, просто они должны быть упакованы в «k-кортежи»
И так как вы предложили :-) Мне нужно пройти пошаговое руководство для 1-го выражения: что делает (¯1 = ⊢) и где поменять местами «разрезы» справа (я предполагаю, что левый разрез - это ⍵ ▶ ⍴)? Я очень восхищаюсь тем, что делает Dyalog, но их документации так не хватает. Думаю, мне нужен "APL для разработчиков C++, с ярлыками и сопоставлениями терминов для 3" представлений "мира" :-), включая простой и более высокий функционал :-). Проблема с ⍨: не вижу напрямую, где это режет выражение (я полагаю, что нужно было бы записать силу привязки), и нет синтаксиса, чтобы «пометить его» (он может разрезать середину «более функционального» каррирования).
@ZXX Я добавил краткое объяснение. Это достаточно? Кстати, сила связывания полностью задокументирована. ⍨
- это просто обычный монадический оператор, такой как ¨
.
Было бы полезно, если бы вы указали, какой APL вы используете.