Working on some matrix algebra here. Sometimes I need to invert a matrix that may be singular or ill-conditioned. I understand it is pythonic to simply do this:
try: i = linalg.inv(x) except LinAlgErr as err: #handle it
but am not sure how efficient that is. Wouldn't this be better?
if linalg.cond(x) < 1/sys.float_info.epsilon: i = linalg.inv(x) else: #handle it
Does numpy.linalg simply perform up front the test I proscribed?
Definition of efficient 1 : productive of desired effects especially : capable of producing desired results with little or no waste (as of time or materials) an efficient worker efficient machinery. 2 : being or involving the immediate agent in producing an effect the efficient action of heat in changing water to steam.
The definition of efficient is being productive with minimal effort. An example of efficient is a car that gets 60 miles to a gallon of gas. Making good, thorough, or careful use of resources; not consuming extra. Especially, making good use of time or energy.
working or operating quickly and effectively in an organized way: The city's transportation system is one of the most efficient in Europe.
So based on the inputs here, I'm marking my original code block with the explicit test as the solution:
if linalg.cond(x) < 1/sys.float_info.epsilon: i = linalg.inv(x) else: #handle it
Surprisingly, the numpy.linalg.inv function doesn't perform this test. I checked the code and found it goes through all it's machinations, then just calls the lapack routine - seems quite inefficient. Also, I would 2nd a point made by DaveP: that the inverse of a matrix should not be computed unless it's explicitly needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With