По поводу хранения - это некоторый вариант хранения разреженных матриц. Фактически, тебе нужна функция, которая переведет координаты двумерного массива в координаты одномерного. В этой функции д.б. 2 ветки - координаты выше главной диагонали и ниже. Во втором случае надо их "отразить" и вернуться к первой ветке.
Код:
function GetIndex(I, J, N : Integer) : Integer;
// I, J - координаты в "квадрате"
// N - размер матрицы
// Result - коорд в линейном массиве
begin
If J > I
Then // Ниже диагонали
Begin
Result := GetIndex(J,I,N);
End
Else // Выше диагонали и диагональ
Begin
// Трансляция координат матрицы в линейный массив
// Сделаешь сам :)
End;