Justin Harrison and Trevor Brennan were both sin-binned
Toulouse (10) 28
Tries: Poitrenaud 2, Nyanga.
Cons: Courrent (2)
Pen: Courrent (3)
Ulster (7) 13
Pens: Wallace (2)
Ulster lost their final Heineken Cup pool match at Toulouse in a match which was overshadowed by ugly incidents on and off the pitch.
Trevor Brennan and Justin Harrison were shown yellow cards for fighting and earlier Brennan had clashed with Ulster fans while warming-up on the touchline.
Full-back Clement Poitrenaud scored two tries for the French club with the final touchdown from Yannick Nyanga.
Matt McCullough got Ulster's try with a drive-over in the first half.
Toulouse enjoyed a flying start as Poitrenaud's sixth-minute try was converted by replacement scrum-half Vincent Courrent.
But Ulster hit back to level in the 13th minute as McCullough was powered over after Kieran Campbell had been stopped just short of the line.
Ulster were level at 13-13 in the second half, thanks to two Paddy Wallace penalties.
But a breakaway try from Poitrenaud gave Toulouse a seven-point lead as the game entered its final 15 minutes.
Courrent continued to rack up the points with another penalty goal, and back row Nyanga sealed the victory with a try in the 74th minute.
Ulster coach Mark McCall was furious with the dismissal of Harrison.
"The match changed in one moment, when Trevor Brennan punches Justin Harrison. We are very lucky Justin has not something seriously wrong with him," said McCall.
"Justin Harrison, like any human being would, reacts slightly, but does not do anything.
"It was a definite straight red for Brennan but the referee copped out, giving him a yellow card and giving Justin a yellow card at the same time.
"The game was 13-all at that time. In my view we lost the game in that moment.
"It is a shame because it took away our focus, but we also lost a player who did not deserve to go off the pitch.
"As for the rugby, there was so much to be positive about because in the first half we were probably as good as we have been all year.
"If we had been more clinical we would have been 15-20 points up."
Toulouse: Poitrenaud, Clerc, Jauzion, Fritz, Heymans, Du Toit, Elissalde, Human, Bru, Poux, Millochlusky, Albacete, Nyanga, Dusatoir, Lamboley, Brennan.
Replacements: Thomas for Clerc (67), Medard for Fritz (28), Courrent for Elissalde (5), Hasan for Human (40), Servat for Bru (40), Brennan for Millochlusky (48), Bouihlou for Brennan (67).
Ulster: Bartholomeusz, Bowe, Trimble, Steinmetz, McKenzie., Wallace, Campbell, B. Young, R Best, S. Best, Harrison, McCullough, N. Best, Dawson, Wilson.
Replacements: Maggs for McKenzie. (68), J Fitzpatrick for B. Young (58), Barker for McCullough (48), Ferris for Wilson (68).
Referee: Tony Spreadbury (Bristol).