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