Se sua matriz tem dimensão em dezenas de milhares ou menos, use um método direto, embora não haja muitos métodos diretos disponíveis gratuitamente para sistemas simétricos indefinidos (na verdade, nenhum que eu saiba seja de código aberto). Existe o MA57 do HSL, mas é gratuito apenas para uso acadêmico. Você certamente pode ignorar a simetria e usar o UMFPACK .
Por volta das dezenas de centenas de dimensões, o uso de memória de um método direto começa a exceder o que razoavelmente um computador desktop pode suportar; portanto, a menos que você tenha uma máquina de memória compartilhada robusta, precisará passar para métodos iterativos. Para problemas indefinidos, você pode especializar BiCG (gradiente biconjugado) para sistemas simétricos, embora a quebra seja possível. Existe um MINRES-QLP lançado recentemente para sistemas simétricos, que fornece mais estabilidade numérica.
Os dois métodos requerem implementações bastante diferentes, pois para métodos diretos você realmente precisa formar a matriz, enquanto na abordagem iterativa, geralmente não forma a matriz explicitamente.
Existem várias razões pelas quais uma abordagem pode ser mais rápida que a outra, especialmente em função da dimensão da matriz. Para sistemas altamente condicionados, os métodos iterativos podem estagnar bastante. Para matrizes não tão esparsas, os métodos diretos acabam criando muito preenchimento, o que atrasa bastante as coisas. Além disso, os métodos diretos no Matlab são altamente otimizados (ele usa o UMFPACK ou o MA57 internamente), enquanto os métodos iterativos geralmente são codificados diretamente no Matlab, e há menos oportunidades para explorar o BLAS de nível 3, já que os gargalos são a aplicação de matvecs e produtos de ponto.