This question already has an answer here:

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

marked as duplicate by Kuba, m_goldberg, Michael E2, Yves Klett, Dr. belisarius Mar 20 '14 at 18:48

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 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.