Проредить | $. _ _ _ | Проредить |
$.y преобразует плотный массив в разреженный, и
наоборот $.^:_1 y преобразует разреженный массив
в плотный. Тождества f -: f&.$. и f -: f&.($.^:_1) выполняются для любой функции f , за возможным исключением тех, которые (как в случае взятия избыточного количества элементов глаголом {.) используют элемент прореживания (“нулевой” элемент) в качестве заполнителя. |
0$.y применяет $. или $.^:_1 по
возможности, тоесть преобразует плотный массив в разреженный, а разреженный
в плотный. 1$.sh;a;e производит разреженный массив. sh указывает размерность. a указывает измерения, которые должны быть разрежены; можно использовать отрицательные индексы. e указывает “нулевой” элемент, его тип определяет тип данных в массиве. Аргумент можно сократить до sh;a (в качестве e тогда берется действительный 0) или вообще до sh (тогда a считается i.#sh — все измерения разрежены, а e действительным нулем). 2$.y дает разреженные измерения ( a ); (2;a)$.y (пере-)определяет их; (2 1;a)$.y дает число байт в (2;a)$.y ; (2 2;a)$.y дает количество элементов в части i представления указанных разреженных измерений a (тоесть #4$.(2;a)$.y). 3$.y дает элемент прореживания (параметр e ); (3;e)$.y переопределяет его. 4$.y дает матрицу индексов (часть i ). 5$.y дает массив значений (часть x ). 7$.y дает количество не-“нулевых” элементов в y , тоесть #4$.y или #5$.y . 8$.y удаляет все полностью “нулевые” значения и соответствующие строки в матрице индексов. Обратный к n&$. глагол есть (-n)&$. . |
] d=: (?. 3 4$2) * ?. 3 4$100 0 55 79 0 0 39 0 57 0 0 0 0 ] s=: $. d проредить d и присвоить s 0 1 | 55 0 2 | 79 отображение s показывает индексы 1 1 | 39 “ненулевых” ячеек и их значения 1 3 | 57 d -: s d и s совпадают 1 o. s π умножить на s 0 1 | 172.788 0 2 | 248.186 1 1 | 122.522 1 3 | 179.071 o. d π умножить на d 0 172.788 248.186 0 0 122.522 0 179.071 0 0 0 0 (o. s) -: o. d результаты функций не зависят от представления 1 0.5 + o. s 0 1 | 173.288 0 2 | 248.686 1 1 | 123.022 1 3 | 179.571 <. 0.5 + o. s 0 1 | 173 0 2 | 248 1 1 | 123 1 3 | 179 (<. 0.5 + o. s) -: <. 0.5 + o. d 1 d + s плотные и/или разреженные аргументы можно смешивать 0 1 | 110 0 2 | 158 1 1 | 78 1 3 | 114 (d + s) -: 2*s обычные алгебраические свойства сохраняются 1 (d + s) -: 2*d 1 +/ s 1 | 94 2 | 79 3 | 57 +/"1 s 0 | 134 1 | 96 |. s перевернуть (т.е. записать в обратном порядке) 1 1 | 39 1 3 | 57 2 1 | 55 2 2 | 79 |."1 s 0 1 | 79 0 2 | 55 1 0 | 57 1 2 | 39 |: s транспонировать 1 0 | 55 1 1 | 39 2 0 | 79 3 1 | 57 $ |: s 4 3 $.^:_1 |: s $.^:_1 преобразовать в плотный 0 0 0 55 39 0 79 0 0 0 57 0 (|:s) -: |:d 1 , s разобрать; дает разреженный вектор 1 | 55 2 | 79 5 | 39 7 | 57 $ , s 12Представление
sh | Размерность, $y . Элементы размерности должны быть меньше 2^31 , но их произведение может быть больше 2^31 . | |
a | Измерение(я), вектор отсортированных разреженных (индексированных) измерений. | |
e | Элемент прореживания (“ноль”). Элемент e также используется в качестве заполнителя, когда элементов массива недостаточно для выборки. | |
i | Индексы — целая матрица индексов для разреженных измерений. | |
x | Значения — (плотный) массив, содержащий (обычно) ненулевые ячейки из элементов неразреженных измерений, соответствующие индексам в матрице i . |
] d=: (?. 3 4$2) * ?. 3 4$100 0 55 79 0 0 39 0 57 0 0 0 0 ] s=: $. d 0 1 | 55 0 2 | 79 1 1 | 39 1 3 | 57Размерность 3 4 ; разреженные измерения 0 1 ; элемент прореживания 0; индексы — первые две колонки чисел в отображении s, значения находятся в последней колонке.
imax =: _1+2^IF64{31 63 | наибольшее представимое целое |
rank =: #@$ | ранг |
type =: 3!:0 | тип данных |
1 = rank sh | вектор |
sh -: <. sh | целый |
imax >: #sh | не больше imax элементов |
(0<:sh) *. (sh<:imax) | ограничено 0 и imax |
1 = rank a | вектор |
a e. i.#sh | ограничено 0 и rank-1 |
a -: ~. a | элементы уникальны |
a -: /:~ a | отсортированы |
0 = rank e | ато́мны |
(type e) = type x | имеет тот-же внутренний тип, что и x |
2 = rank i | матрица |
4 = type i | целое |
(#i) = #x | столько строк, сколько элементов в x |
({:$i) = #a | столько столбцов, сколько разреженных измерений |
(#i) <: */a{sh | # строк ограничено произведением длин разреженных измерений |
imax >: */$i | # элементов ограничено imax |
(0<:i) *. (i <"1 a{sh) | i ограничено 0 и длинами разреженных измерений |
i -: ~.i | строки уникальны |
i -: /:~ i | строки отсортированы |
(rank x) = 1+(#sh)-#a | ранг равен 1 плюс число плотных измерений |
imax >: */$x | # элементов ограничено imax |
(}.$x)-:((i.#sh)-.a){s | размерность элемента состоит из элементов размерностей, соответствующих плотным измерениям |
(type x) e. 1 2 4 8 16 32 | внутренний тип булевский, текстовый, целый, действительный, комплексный, или упакованный |
] d=: (0=?. 2 3 4$3) * ?. 2 3 4$100 46 0 0 0 0 39 0 0 0 0 46 0 0 0 0 0 0 60 0 62 0 0 60 64 ] s=: $. d проредить d и присвоить s 0 0 0 | 46 0 1 1 | 39 0 2 2 | 46 1 1 1 | 60 1 1 3 | 62 1 2 2 | 60 1 2 3 | 64 d -: s совпадение не зависит от представления 1 2 $. s разреженные измерения 0 1 2 3 $. s элемент прореживания 0 4 $. s матрица индексов; столбцы соотв. разреж. измерениям 0 0 0 0 1 1 0 2 2 1 1 1 1 1 3 1 2 2 1 2 3 5 $. s соответствующие значения 46 39 46 60 62 60 64 ] u=: (2;2)$.s сделать разреженным только измерение 2 0 | 46 0 0 | 0 0 0 | 1 | 0 39 0 | 0 60 0 | 2 | 0 0 46 | 0 0 60 | 3 | 0 0 0 | 0 62 64 4 $. u матрица индексов 0 1 2 3 5 $. u соответствующие значения 46 0 0 0 0 0 0 39 0 0 60 0 0 0 46 0 0 60 0 0 0 0 62 64 ] t=: (2;0 1)$.s сделать разреженными измерения 0 1 0 0 | 46 0 0 0 0 1 | 0 39 0 0 0 2 | 0 0 46 0 1 1 | 0 60 0 62 1 2 | 0 0 60 64 7 {. t взять 0 0 | 46 0 0 0 0 1 | 0 39 0 0 0 2 | 0 0 46 0 1 1 | 0 60 0 62 1 2 | 0 0 60 64 $ 7 {. t 7 3 4 7{."1 t взять с рангом 0 0 | 46 0 0 0 0 0 0 0 1 | 0 39 0 0 0 0 0 0 2 | 0 0 46 0 0 0 0 1 1 | 0 60 0 62 0 0 0 1 2 | 0 0 60 64 0 0 0 0 = t 0 0 | 0 1 1 1 0 1 | 1 0 1 1 0 2 | 1 1 0 1 1 1 | 1 0 1 0 1 2 | 1 1 0 0 3 $. 0 = t разреженный элемент 0=t есть 1 1 +/ , 0 = t 17 +/ , 0 = d результат не зависит от представления 17 0 { t выбрать 0 | 46 0 0 0 1 | 0 39 0 0 2 | 0 0 46 0 _2 (<1 2 3)}t Заменяя 0 0 | 46 0 0 0 0 1 | 0 39 0 0 0 2 | 0 0 46 0 1 1 | 0 60 0 62 1 2 | 0 0 60 _2 s=: 1 $. 20 50 1000 75 366 $ s 20 стран, 50 регионов, 1000 продавцов, 20 50 1000 75 366 75 продуктов, 366 дней в году */ $ s перемноженная размерность превышает 2^31 2.745e10 r=: ?. 1e5 $ 1e6 доходы i=: ?. 1e5 5 $ $ s где, за что и когда они получены s=: r (<"1 i)} s занести в массив 7 {. ": s первые 7 строк в отображении s 0 0 20 48 150 | 395543 первая строка говорит: для страны 0, региона 0, 0 0 39 40 67 | 316198 продавца 20, продукта 48, дня 150, 0 0 47 37 172 | 650782 доход был 395543 0 0 52 32 358 | 789844 0 0 54 62 82 | 923413 0 0 67 17 103 | 567367 0 0 91 13 295 | 470919 +/ , s полный доход |limit error выражение не сработало для ,s поскольку оно | +/ ,s потребовало бы вектор длины 2.745e10 +/@, s полный доход 4.98338e10 f/@, поддержана специальным кодом +/+/+/+/+/ s полный доход 4.98338e10 +/^:5 s 4.98338e10 +/^:_ s 4.98338e10 +/ r 4.98338e10 +/"1^:4 s полный доход по странам 0 | 2.49298e9 1 | 2.35118e9 2 | 2.49324e9 3 | 2.44974e9 4 | 2.45138e9 5 | 2.47689e9 6 | 2.55936e9 7 | 2.47153e9 8 | 2.45907e9 9 | 2.50249e9 10 | 2.52785e9 11 | 2.49482e9 12 | 2.57532e9 13 | 2.46509e9 14 | 2.54962e9 15 | 2.48942e9 16 | 2.50503e9 17 | 2.52147e9 18 | 2.50127e9 19 | 2.49603e9 t=: +/^:2 +/"1^:2 s полный доход по продавцам $t 1000 7{.t 0 | 5.08254e7 1 | 5.61577e7 2 | 4.19914e7 3 | 5.90514e7 4 | 6.08208e7 5 | 4.10632e7 6 | 4.36616e7Линейная Алгебра Разреженных Массивов
f=: }. @ }: @ (,/) @ (,."_1 +/&_1 0 1) @ i. f 5 индексы для трёхдиагональной матрицы 5 на 5 0 0 0 1 1 0 1 1 1 2 2 1 2 2 2 3 3 2 3 3 3 4 4 3 4 4 s=: (?. 13$100) (<"1 f 5)} 1 $. 5 5;0 1 $s 5 5Фраза 1$.5 5;0 1 производит разреженный массив размерности 5 5 с разреженными измерениями 0 1 ; <"1 f 5 дает упакованные индексы; а x (<"1 f 5)}y заменяет x места в y, указанные индексами (замена вразброс).
s 0 0 | 46 0 1 | 55 1 0 | 79 1 1 | 52 1 2 | 54 2 1 | 39 2 2 | 60 2 3 | 57 3 2 | 60 3 3 | 94 3 4 | 46 4 3 | 78 4 4 | 13 ] d=: $.^:_1 s плотное представление s 46 55 0 0 0 79 52 54 0 0 0 39 60 57 0 0 0 60 94 46 0 0 0 78 13 ] y=: ?. 5$80 66 75 79 52 54 y %. s 0.352267 0.905377 0.00169115 0.764716 _0.434452 y %. d ответы не зависят от представления 0.352267 0.905377 0.00169115 0.764716 _0.434452 s=: (?. (_2+3*1e5)$1000) (<"1 f 1e5)} 1 $. 1e5 1e5;0 1 $ s s — матрица 1e5 на 1e5 100000 100000 y=: ?. 1e5$1000 ts=: 6!:2 , 7!:2@] время и память на выполнение ts 'y %. s' 0.0550291 5.24358e6 0.056 секунд; 5.2 мегабайта (PIII 500 Mhz)Текущее Состояние Реализации
= =. =: < d <. <: > >. >: _ _. _: + +. +: * *. *: - -. -: % %. d %: ^ ^. $ $. $: ~ ~. ~: | |. |: .. .: : :. :: , ,. ,: ;. # ! !. !: / m /. d /: m \ m \. m \: m [ [: ] { d {. {: } d }. }: " ". ": m ` `: @ @. @: & &. &: e. d i. i: j. o. r. _9: to 9: 3!:0 3!:1 3!:2 3!:3 4!:55Замечания: