Domanda

I'm working on J.

How can I convert this matrix:

   (i.10)*/(i.10)
0 0  0  0  0  0  0  0  0  0
0 1  2  3  4  5  6  7  8  9
0 2  4  6  8 10 12 14 16 18
0 3  6  9 12 15 18 21 24 27
0 4  8 12 16 20 24 28 32 36
0 5 10 15 20 25 30 35 40 45
0 6 12 18 24 30 36 42 48 54
0 7 14 21 28 35 42 49 56 63
0 8 16 24 32 40 48 56 64 72
0 9 18 27 36 45 54 63 72 81

in array?

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

I tried

(i.10)*/(i.10)"0

and then I've added

~.(i.10)*/(i.10)"0

to eliminate doubles, but it doesn't work.

È stato utile?

Soluzione

If you want to turn a 2-dimensional table (matrix) into a 1-dimensional list (vector or "array", though in the J world "array" usually means "rectangle with any number [N] of dimensions"), you can use ravel (,):

   matrix =: (i.10)*/(i.10)
   list  =: , matrix

   list
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 ...

Now using nub (~.) to remove duplicates should work:

   ~. list
0 1 2 3 4 5 6 7 8 9 10 12 ...

Note that, in J, the shape of an array usually carries important information, so flattening a matrix like this would be fairly unusual. Still, nothing stopping you.

BTW, you can save yourself some keystrokes by using the adverb ~, which will copy the left argument of a dyad to the right side as well, so you could just say:

   matrix =: */~ i. 10

and get the same result as (i.10) */ (i.10).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top