# How to compile gather? [duplicate]

First question，How to Compile this？

gather[data_]:=Gather[data, Mod[#1, 3] == Mod[#2, 3] &]


I dont know why this is wrong.

cf = Compile[{{data, _Integer, 1}}, Gather[data, Mod[#1, 3] == Mod[#2, 3] &]]
cf[Range[9]]
cf[Range[10]]


Second question，How to Compile this？

gather[data_] := Gather[data, Count[#1, 0] == Count[#2, 0] &]
gather[RandomInteger[{0, 5}, {10, 5}]]

• I don't believe that Gather is compilable. You can see a list of compilable functions in the answers to this question. Mar 20, 2014 at 13:59
• Not every function can be compiled. Gather cannot be compiled. The reason why Gather is not compilable is that it returns a ragged array and compiled code doesn't support ragged arrays. Mar 20, 2014 at 13:59
• sorry...My memory is wrong...but if i change gather to tally ,how to compile second situation？ Mar 20, 2014 at 14:17
• @Chenminqi In the second situation is every sublist of data of the same length? This is necessary to make it compilable. Vectorization may be better though. Tally@Total[1-Unitize[data],{2}] should do it if I didn't make a mistake (untested). Mar 20, 2014 at 14:27

Not every function can be compiled by Compile, and those functions which are supported are often supported only partially, for numerical arguments only.
Gather cannot be compiled. The reason for this is that Gather will usually return a ragged array and compiled functions can only work with full (i.e. rectangular), homogeneous numerical arrays.