Do we need Mat, Vec, TMmat, Diag, Sym and other matrix types?

jmh530 john.michael.hall at gmail.com
Tue Mar 13 20:37:51 UTC 2018


On Tuesday, 13 March 2018 at 16:40:13 UTC, 9il wrote:
> On Tuesday, 13 March 2018 at 14:13:02 UTC, jmh530 wrote:
>> [snip]
>>
>> I'm not sure I understand what your syntax solution does...
>
> matrix(j, i) == matrix[i, j] (reversed order)
>

Hopefully, I made the issue more clean in my response to Martin. 
The issue with row/column major order is one-part performance and 
one-part interoperability with other Matrix libraries.

Perhaps most importantly for that syntax is to imagine how 
confusing a new user would find that syntax... A free-standing 
function, such as the simple one below, might be less confusing. 
Also, this is a solution for the Matrix type, but not so much the 
Slice type.

auto reverseIndex(T)(T x, size_t i, size_t j)
{
     return(x[j, i]);
}

The reverseIndex function is convenient, but you are looping 
through each element of the second column. Is there any 
performance advantage to using the reverseIndex function to do 
so? I suspect not. This is because you still have to jump around 
in memory because the underlying storage is row-major. You may 
not notice this effect when the CPU is able to pre-fetch the 
whole matrix and put it in cache, but as the matrix gets larger, 
then you can't fit it all in cache and it starts to matter more. 
Also, you might break vector operations.

Personally, while I think it's important to think about, I also 
don't think it's a hugely pressing issue so long as the API is 
flexible enough that you can add the functionality in the future.


More information about the Digitalmars-d mailing list