Я бы реализовал это как рваный массив, где A [n] [0] всегда возвращает элемент по диагонали.A [n] [1] вернет элемент справа от диагонали, A [n] [2] вернет элемент слева от диагонали, и так.Затем вам просто нужна функция, которая отображает матричный индекс [i, j] на индекс рваного массива [r] [s].
Это имеет преимущество в разреженности, и если ваши значения остаются близкими к диагонали,массивы не очень длинные.
В качестве альтернативы вы можете иметь это определение:
struct Row
{
int InitialOffset;
int NumElements;
int[] Values;
}
Тогда у вас будет строка [].Получение значения, основанного на матричном индексе, будет выглядеть следующим образом:
//matrix is merely an array of rows...
int GetValue(*matrix this, int i, int j)
{
Row CurrentRow = (*this)[i];
if (CurrentRow.InitialOffset > j)
return 0;
else if (CurrentRow.InitialOffset + CurrentRow.NumElements < j)
return 0;
return CurrentRow.Values[j - CurrentRow.InitialOffset]
}
Мой синтаксис C немного мутен, но вы должны понять.
На основании вашей демонстрации,Я бы порекомендовал это:
struct Matrix
{
int[,] Data
int[] StartOffset;
int[] NumberElements;
}
Использовать следующим образом ...
int GetValue(*Matrix this, int i, int j)
{
if (this.StartOffset[i] > j)
return 0;
else if (this.StartOffset[i] + this.NumberElements[i] < j)
return 0;
return this.Data[i, j-this.StartOffset[i]];
}
Ваша процедура инициализации будет выглядеть примерно так
//Data is a struct that holds row index, col index, and value
Matrix* InitMatrix (*Data values, int numVals)
{
//loop through values to find longest row and number of rows
//create new matrix, malloc matrix for longrow * numRows
//malloc numrows elements for StartOffset and NumItems
//foreach row, find min() and max()-min() of col indexs and
//store in StartOffset and NumItems
}
Вам нужно сделатьнекоторая обработка, но сжатие данных не дешево.