Since we have a pile of methods but no timings I'll perform that test.
First my own:
mrwizard[a_] := UnitStep[Min /@ a - a]
And other functions as I'll use them:
murta[list_] := Thread[# == Min[#]] & /@ list // Boole
acl[mat_] := SparseArray[Position[#, Min[#]] -> 1, Length@#] & /@ mat // Normal
artes[a_] := UnitStep[ Min @ # - #]& /@ a
swish[a_] := Thread[KroneckerDelta[Min@#, #]] & /@ a
I leave out RiemannZeta's method as it only works on rows of length two, and therefore does not meet the question specification.
SetAttributes[timeAvg, HoldFirst]
timeAvg[func_] :=
Do[If[# > 0.3, Return[#/5^i]] & @@ Timing@Do[func, {5^i}], {i, 0, 15}]
funcs = {murta, acl, artes, swish, mrwizard};
Many short rows:
a = RandomReal[{-9, 9}, {150000, 3}];
timeAvg[#@a] & /@ funcs
{0.452, 1.42, 0.515, 0.468, 0.04184}
SameQ @@ (#@a & /@ funcs)
True
Long rows:
a = RandomReal[{-9, 9}, {100, 30000}];
timeAvg[#@a] & /@ funcs
{0.827, 0.421, 0.02496, 1.108, 0.1216}
SameQ @@ (#@a & /@ funcs)
True
From this it appears that Artes' method is fastest on a matrix with a limited number of long rows, and my method which is based on his is fastest on a matrix with many short rows.