El número de elementos únicos, m, necesarios para ser representada en una n por la matriz n simétrica:
Con la diagonal principal
m = (n*(n + 1))/2
Sin la diagonal (por matriz simétrica como la OP describe, principal diagonal es necesaria, pero solo para una buena medida ...)
m = (n*(n - 1))/2
.
No se divide por 2 hasta que la última operación es importante si se usa la aritmética de enteros con truncamiento.
También necesita hacer algo de aritmética para encontrar el índice, i, en la memoria asignada correspondiente a la fila xy la columna y en la matriz diagonal.
Índice en la memoria asignada, i, de la fila x y la columna y en la matriz diagonal superior:
Con la diagonal
i = (y*(2*n - y + 1))/2 + (x - y - 1)
Sin la diagonal
i = (y*(2*n - y - 1))/2 + (x - y -1)
Para una matriz diagonal más baja invierte xey en las ecuaciones. Para una matriz simétrica simplemente elija x> = y o y> = x internamente y haga que las funciones de miembros se volteen según sea necesario.
Aquí tiene un ejemplo de Matriz triangular inferior implementada en C++ https://github.com/fylux/TriangularMatrix – Fylux