Как сформировать массив (последовательность), чтобы иметь произвольное количество строк для заданного количества столбцов - PullRequest
0 голосов
/ 14 декабря 2018

Простой пример, чтобы показать структуру:

{<b>190</b> 10 ⍴⍵}{(⍳⍵)}1900

То, что " 190 " должно быть вычислено как <b>⌈</b>⍴⍵÷10 или если есть символ, чтобы сказать "упаковать все элементы"в массив R и пусть он имеет столько строк, сколько необходимо ".{(⍳⍵)}1900 - это просто замена произвольного кода, который будет генерировать «поток» чисел, и как только они будут разбиты на строки, в левой части будет больше функций.

Проблема заполнения поляпоследняя строка следующая, так что если у кого-то есть идея для этого (без разбора размера кода), не стесняйтесь вмешиваться. Или, возможно, было бы более компактным сделать эту часть первой (если есть простой способ нарезкиэто при условии, что число точно кратно желаемой необработанной ширине)?Возможно, ширина строки должна быть переменной (входной, параметр) последней.

1 Ответ

0 голосов
/ 14 декабря 2018

Дайте мне знать, если какой-либо из следующих кодов неясен, так как я затем уточню, как он работает.

Точное соответствие

My Репозиторий Dyalog APL Extended содержит функцию покрытия для , которая делает именно это, но обобщается на массивы всех рангов.Это позволяет вам использовать ¯1, чтобы указать, что длина конкретного измерения должна автоматически рассчитываться для точного соответствия данным.Код выглядит следующим образом:

⍵⍴⍨(|(×/⍴⍵)÷×/⍺)@(¯1=⊢)⍺, где - вектор формы, а - данные. Попробуйте!
(|(×/⍴⍵)÷×/⍺) вычисляет длину длины, отмеченной ¯1
@(¯1=⊢), исправляет с этим значением в позициях, обозначенных маской (¯1=⊢)⍺ (см. train )
⍵⍴⍨ изменяет форму с этой формой (вместо того, чтобы преобразовывать ее в форму )

Если вам просто нужна матрица, выполните следующеезадание в любом APL, которое вы можете использовать:

(((×/⍴⍵)÷⍺),⍺)⍴⍵, где - количество строк, а - данные. Попробуйте!

Заполнение

Если вы знаете, что хотите дополнить последний ряд (в отличие от ошибки или пропуска неполного завершающего ряда), у вас в основном есть три варианта:

  1. Повторное использование элементов с начала данных

  2. Пэд с элементом-прототипом

  3. Накладка с пользовательским элементом заполнения

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>⍵ Попробуйте!

...