2016-09-25 48 views
5

Powiedzmy mamy tablicęJ: Współrzędne przy określonej wartości

0 1 2 3 4 5 8 7 8 9 

Istnieją dwa indeksy, które mają wartość 8:

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

Czy istnieje jakiś sposób, aby uzyskać krótszy ten wynik? Może być czasem wbudowanym czasownikiem.

Ale ważniejsze. A co z większymi wymiarami? Powiedzmy mamy 5x4 macierzy

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

Chcę dowiedzieć się, jakie są współrzędne z wartością 6.
chcę dostać spowodować takie (są trzy współrzędne):

4 1 
3 2 
2 3 

To dość podstawowe zadanie i myślę, że powinno istnieć jakieś proste rozwiązanie.

To samo w trzech wymiarach?

Dziękuję

Odpowiedz

3

Verb indices I. prawie spełnia swoje zadanie.

Kiedy masz prostą listę, korzystanie I. „s jest prosta:

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

Dla większych matrycach porządkowych można powiązać z antibase #: aby uzyskać współrzędne w bazie $ matrix. Np:

]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 

Podobnie, dla dowolnej liczby wymiarów: spłaszczenia (,) Porównaj (=), uzyskać indeksy (I.) i konwersji współrzędnych (($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 

Nawiasem mówiąc, możesz napisać I. x = y jako x ([email protected]:=) y dla dodatkowej wydajności. Jest special code do

wskaźników gdzie y

4

Działanie funkcji Sparse tablicy ($.) x-F zapewnia bardzo szybki i chudego rozwiązanie działa także dla wielu wymiarach.

]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 

milcząco:

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

Nigdy nie zauważyłem wcześniej. Bardzo interesujące. W macierzy całkowitej 1e5 x 1e5' '$ .' jest około 3 razy szybsze i wykorzystuje 1/10 spacji. – Eelvex