>>  <<  Ркв  Ввд  JfC  LJ  Фрз  Слв  Изм  Рзг  !:  Помощь  Словарь

Проредить $.  _ _ _ Проредить

$.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)&$. .
 

Следующее подробное описание содержит разделы: Введение, Представление, Предположения, Дальнейшие Примеры, Линейная Алгебра Прореженных Массивов, и Текущее Состояние Реализации.

Введение

Ниже описывается расширение J для работы с массивами в которых “нули не занимают места”. Для создания таких разреженных массивов определен новый глагол $. , а существующие примитивы расширены для работы с ними. Основные идеи можно иллюстрировать следующими примерами:

   ] 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
Представление

Разреженный массив y может быть булевским, целым, действительным, комплексным, текстовым или упаковочным. Его внутренним представлением является sh;a;e;i;x , где:

sh  Размерность, $y . Элементы размерности должны быть меньше 2^31 , но их произведение может быть больше 2^31 .
a  Измерение(я), вектор отсортированных разреженных (индексированных) измерений.
e  Элемент прореживания (“ноль”). Элемент e также используется в качестве заполнителя, когда элементов массива недостаточно для выборки.
i  Индексы — целая матрица индексов для разреженных измерений.
x  Значения — (плотный) массив, содержащий (обычно) ненулевые ячейки из элементов неразреженных измерений, соответствующие индексам в матрице i .

Для разреженной матрицы s , использованной во введении,
   ] 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, значения находятся в последней колонке.

Скаляры представляются плотно. Все примитивы принимают разреженные и/или плотные массивы в качестве аргументов (т.е. sparse+dense or sparse$sparse). Отображение разреженного массива состоит из отображения матрицы индексов (часть i ), пустого столбца, столбца вертикальных линий, еще одного пустого столбца, и соответствующих ячеек значения (часть x ).

Возможность установки произвольного элемента прореживания (не только нуля) позволяет замкнуть на разреженных массивах много больше функций (например ^y или 10+y), так что знакомые фразы будут производить знакомые результаты (например, <.0.5+y округляет до ближайшего целого).

Предположения

Для разреженного массива выполняются следующие предположения, проверяемые при каждом его отображении.

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)
Текущее Состояние Реализации

По состоянию на 2005-12-17, разреженные массивы поддерживаются следующими примитивами:

=       =.      =: 
< 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
Замечания:


>>  <<  Ркв  Ввд  JfC  LJ  Фрз  Слв  Изм  Рзг  !:  Помощь  Словарь