NJank wrote

siko1056 wrote

If your matrix is really sparse, then the number of columns n should be smaller

than the number of rows m (transpose if not). Otherwise you waste space for

storing zero columns.

Maybe a naive side question, but wouldn't it make sense to have the

transposition automatic and transparent as part of the storage class? A

"transposed?" flag and the check would be the only overhead.

I don't think it is a naive question, I also thought about it. In my opinion the programmer should control the sparse matrix orientation, especially in regard of my second assertion:

siko1056 wrote

2. Do I often extract parts of the matrix or insert elements?

Randomly extracting or adding parts of a sparse matrix might be a real performance killer!

If I construct a sparse matrix and manipulate it occasionally, and despite this inefficiency, Octave transposes back and forth (because the number of columns is temporarily below a threshold value) I have a serious not controllable performance breakdown. So Octave should remain predictive. To mention this nuance came up to my mind, as I work with matrices like this one, where it saves about 2/3 space to choose the "right" orientation:

>> typeinfo (A)

ans = sparse matrix

>> size (A)

ans = 2,569,260 7,230

>> nnz(A)

ans = 855,800

>> nnz(A) / prod (size (A)) % less than 1% filled

ans = 4.6071e-05

>> whos A

Variables in the current scope:

Attr Name Size Bytes Class

==== ==== ==== ===== =====

A 2,569,260x7,230 13,834,168 double

Total is 18,575,749,800 elements using 13,834,168 bytes

>> A = A'; size (A)

ans = 7230 2569260

>> whos A

Variables in the current scope:

Attr Name Size Bytes Class

==== ==== ==== ===== =====

A 7,230x2,569,260 34,246,888 double

Total is 18,575,749,800 elements using 34,246,888 bytes

>> spy(A) % as attachment

Best,

Kai