Хранение матрицы в виде массива без лишней памяти

Есть матрица n*n вида:

[X O]
[Y E]

, где X - матрица m*m, m<n, Y - матрица l*l, l<n, E - единичная матрица m*m, O - нулевая матрица l*l. Как правильно хранить матрицу и преобразовывать индексы i,j при обращении к матрице так, чтобы можно было не хранить лишние E и O в памяти (мы знаем, что они всегда там)? Если храним по строкам в 1 массиве, то, например, можно хранить массивом [x11...x1m,...,xm1,...,xmm,0,y11...y1l,...,yl1...yll,1], но как тогда преобразовать i, j в правильный индекс этого массива? В общем случае: как преобразовывать последовательный диапазон чисел в другой случайный?


Ответы (1 шт):

Автор решения: Harry

Если верно все, что в комментариях сказано :) — что все матрицы mxm и достаточно (i,j), а метка c++ действует...

Наброски:

class Matrix
{
    vector<int> x, y;         // int или что там у вас
    size_t m;
    public: 
    Matrix(int m, ....):m(m)  // + Инициализация векторов x[m*m] и y[m*m]

    int operator()(size_t i, size_t j)
    {
        if (i >= 2*m || j >= 2*m)   // Обработка ошибки выхода за границу
 
        if (i < m) return (j < m) ? x[i*m+j] : 0;
        i -= m;
        return (j < m) ?y[i*m+j] : (j-m == i ? 1 : 0);
    }

Вобщем, как-то так... Можно возвращать ссылку, создав элемент 0 и 1, но тогда есть риск все порушить.

→ Ссылка