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] &]]

Second question,How to Compile this?

gather[data_] := Gather[data, Count[#1, 0] == Count[#2, 0] &]
gather[RandomInteger[{0, 5}, {10, 5}]]
  • 2
    $\begingroup$ I don't believe that Gather is compilable. You can see a list of compilable functions in the answers to this question. $\endgroup$ – Mark McClure Mar 20 '14 at 13:59
  • 1
    $\begingroup$ 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. $\endgroup$ – Szabolcs Mar 20 '14 at 13:59
  • $\begingroup$ sorry...My memory is wrong...but if i change gather to tally ,how to compile second situation? $\endgroup$ – Apple Mar 20 '14 at 14:17
  • 1
    $\begingroup$ @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). $\endgroup$ – Szabolcs Mar 20 '14 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.


Not the answer you're looking for? Browse other questions tagged or ask your own question.