| Проредить | $. _ _ _ | Проредить |
|
$.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
Замечания: