2016-09-25 10 views
5

Допустим, у нас есть массивJ: Координаты с определенным значением

0 1 2 3 4 5 8 7 8 9 

Есть два показателя, которые имеют значение 8:

(i.10) ([#~8={) 0 1 2 3 4 5 8 7 8 9 
6 8 

есть ли более короткий путь, чтобы получить этот результат? Может быть какой-то встроенный глагол.

Но более важно. Что относительно более высоких измерений? Допустим, мы имеем матрицу 5x4

1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
4 5 6 7 8 

Я хочу, чтобы выяснить, какие координаты со значением 6.
Я хочу, чтобы получить результат такой (три координаты):

4 1 
3 2 
2 3 

Это довольно основная задача, и я думаю, что это должно существовать в некотором простом решении.

То же самое в трех измерениях?

Спасибо

ответ

3

Глагол indices I. почти делает работу.

Если у вас есть простой список, использование I. «s прост:

I. 8 = 0 1 2 3 4 5 8 7 8 9 
6 8 

Для матриц высокого порядка можно соединить его с antibase #:, чтобы получить координаты в базе $ matrix. Например:

]a =: 4 5 $ 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 
1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
4 5 6 7 8 

I. 6 = ,a 
9 13 17 

($a) #: 9 13 17 
1 4 
2 3 
3 2 

Аналогично, для любого числа измерений: сплющить (,), сравнения (=), получаем индексы (I.) и преобразования координат (($a)&#:):

]coords =: ($a) #: I. 5 = , a =: ? 5 6 7 $ 10 
0 0 2 
0 2 1 
0 2 3 
... 
(<"1 coords) { a 
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 

Кстати, вы можете написать I. x = y как x ([email protected]:=) y для дополнительной производительности. Это special code для

индексов, где X F у

4

Используя функциональные возможности Sparse массива ($.) обеспечивает очень быстрый и обедненный раствор, который также работает на нескольких измерениях.

]a=: 5 ]\ 1 + i. 8 
1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
4 5 6 7 8 
    6 = a 
0 0 0 0 0 
0 0 0 0 1 
0 0 0 1 0 
0 0 1 0 0 
    4 $. $. 6 = a 
1 4 
2 3 
3 2 

молчаливо:

getCoords=: 4 $. $. 
    getCoords 6 = a ,: a 
0 1 4 
0 2 3 
0 3 2 
1 1 4 
1 2 3 
1 3 2 
+0

Никогда не заметил, что раньше. Очень интересно. В целочисленной матрице '1e5 x 1e5'' $ .' примерно в 3 раза быстрее и использует 1/10 пространства. – Eelvex

 Смежные вопросы

  • Нет связанных вопросов^_^