2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как выделить память под треугольную матрицу?
Сообщение27.11.2006, 01:17 
Есть симметричная матрица жесткости(NxN), естественно в целях экономии памяти не смысла хранить её полностью , но как выделить память только для хранения одной треугольной её части через оператор new (в С++ или Java)?
Вот выделение памяти через оператор new для всей матрицы:
Код:
int n,i;
float **a = new float*[n];
for(i=1;i<=n;i++)
a[i]=new float[n];

 
 
 
 Re: Как выделить память под треугольную матрицу?
Сообщение27.11.2006, 02:09 
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 диагональных элементов, а затем поддиагональный или наддиагональный треугольник.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group