vitaly333 писал(а):
Есть симметричная матрица жесткости(NxN), естественно в целях экономии памяти не смысла хранить её полностью , но как выделить память только для хранения одной треугольной её части через оператор new (в С++ или Java)?
В численных алгоритмах с экономией памяти для симметричных матриц ее элементы обычно хранят не в 2-мерном, а в 1-мерном массиве:
Код:
int n;
float *a = new float*[n*(n+1)/2];
Для пересчета индексов можно использовать функцию типа
Код:
int GetAddr(int i, int j)
{
return ( i>=j ? j+i*(i+1)/2 : i+j*(j+1)/2 );
}
Она соответствует хранению нижней части по строкам (== верхней - по столбцам): 00, 10, 11, 20, 21, 22, 30, ... Для эффективности можно включить адресную арифметику внутрь циклов, избавляясь от умножений.
Однажды мне встретился вариант, когда в 1-мерном массиве сначала идут N диагональных элементов, а затем поддиагональный или наддиагональный треугольник.