In the spirit of *Mathematica* 10 I would have written it: Composition[ DeleteCases[{{0} ..}], Map[Transpose], SplitBy[#, Unitize@*Total] &, Transpose ]@mat > `{{{0, 0}, {1, 0}, {0, 1}, {0, 0}, {1, 1}, {0, 0}}, {{0}, {1}, {0}, > {0}, {1}, {1}}, {{1}, {1}, {0}, {1}, {0}, {1}}}` With rules I would write: Transpose /@ {Transpose[mat] //. {el__, {0 ..}, rest___} :> Sequence[{el}, {rest}]} > `{{{0, 0}, {1, 0}, {0, 1}, {0, 0}, {1, 1}, {0, 0}}, {{0}, {1}, {0}, > {0}, {1}, {1}}, {{1}, {1}, {0}, {1}, {0}, {1}}}` The first method assumes numeric matrix elements but the second doesn't.