LDLT-разложение

Oct 16, 2019 18:08

В некотором смысле, "заметки для себя": алгоритмы линейной алгебры обладают нехорошим свойством write-only, особенно если там участвует "треугольная адресация". Пока разбираешь - всё вроде понятно, а чуть-чуть погодя смотришь на это безобразие - и оно превращается в набор вложенных циклов и десяток индексов массива, которые обновляются на каждой ( Read more... )

tex, математика, работа

Leave a comment

Comments 22

lj_frank_bot October 16 2019, 15:10:08 UTC
Здравствуйте!
Система категоризации Живого Журнала посчитала, что вашу запись можно отнести к категории: Работа.
Если вы считаете, что система ошиблась - напишите об этом в ответе на этот комментарий. Ваша обратная связь поможет сделать систему точнее.
Фрэнк,
команда ЖЖ.

Reply

nabbla1 October 21 2019, 17:33:41 UTC
Наука.

Reply

lj_frank_bot October 21 2019, 17:34:35 UTC
Упс.

Reply


ddem1979 October 16 2019, 20:26:10 UTC
Позанудствую, но на телефоне андроидный файрфокс на половину формул выдал кашу...
\left он не понимает...

Reply

nabbla1 October 16 2019, 20:30:47 UTC
Это вообще странно: с точки зрения браузера это должна быть просто картинка, она рендерится на серверной стороне.

Вижу две возможные причины: или была ошибка на серверной стороне (сайт latex.codecogs.com), или выдаваемый .svg браузер невзлюбил.

Там можно в .png результат выдавать, но мне .svg больше нравился, т.к при масштабировании странички формулы остаются гладкими. Давайте сейчас переправлю в .png - и посмотрите ещё разок. (там просто вместо latex.codecogs.com/svg.latex?... пишется latex.codecogs.com/png.latex?...)

Reply

ddem1979 October 16 2019, 20:36:33 UTC
ddem1979 October 16 2019, 20:42:42 UTC
Я ТеХ люблю, но и проблем с ним много. Нормальный шрифт и пробелы в формулах. оформить все по ГОСТам, которые каждый год меняются. В-общем, я в ТеХе только научное набираю, на отсылку наружу, а всю повседневку - в Ворд 2003 (((

Reply


kouzdra October 17 2019, 15:31:10 UTC
алгоритмы линейной алгебры обладают нехорошим свойством write-only, особенно если там участвует "треугольная адресация". Пока разбираешь - всё вроде понятно, а чуть-чуть погодя смотришь на это безобразие - и оно превращается в набор вложенных циклов и десяток индексов массива, которые обновляются на каждой итерации не вполне понятным образом

Я сам подобный опыт имею - интересно - а что никто еще не сделал пакета для генерации подобных реализаций из вменяемого кода - потому что задача стандартизованная почти до одури - технически все просто должно быть.

Reply

nabbla1 October 17 2019, 16:35:04 UTC
Я пока только встречал библиотеку на C, которая была сделана честной переделкой кода на фортране, с индексами типа ii, jj, kk, nn, mm. Возможно, решили "работает-не лезь!".

Но что я сейчас это вспомнил - потому как решил эту самую треугольную адресацию выкинуть нахрен, а просто в неиспользуемый верхний треугольник положить другие данные. Поначалу была идея сделать треугольную адресацию "аппаратно", но как-то оно не смотрится.

Reply

kouzdra October 18 2019, 05:50:24 UTC
Я скорее про что-то APL-образное, только подточенное именно под матрицы-вектора.

Reply


quartisz December 25 2019, 03:47:25 UTC
А где можно найти готовую процедуру для LDLt на Pascal или Фортран, ну или на Си на худой конец?

Reply

nabbla1 December 25 2019, 13:40:14 UTC
У меня есть:

procedure CholeskyLDL (const a: array of Real; N: Integer; out u: array of Real);
var i: Integer; //счётчик для самого глубокого цикла
icol: Integer; //столбец, на котором текущий обраб. элемент
irow: Integer; //строка на которой текущий обраб. элемент
j: Integer; //указывает на элемент u[1, icol]
k: Integer; //указывает на элемент u[irow, icol], который и обрабатывается
l: Integer; //указывает на элемент u[i, irow]
m: Integer; //указывает на элемент u[i, icol]
d: Integer; //указывает на диагональный элемент u[i,i]
w: Real; //промежут. значение

begin
if N <= 0 then
raise Exception.Create('CholeskyLDL: N <= 0');

if ( Length(a) < N * ( N + 1 ) div 2 ) or (Length(u) < N * (N + 1) div 2) then ( ... )

Reply

quartisz December 25 2019, 13:53:52 UTC
Спасибо. А массивы почему одномерные?
Я вот такую написал процедуру.

type
TExtVec = array of Extended;
TExtMatr = array of TExtVec;

procedure LDLT(n: Integer; var a,L: TExtMatr; var d: TExtVec);
var i,j,k: Integer;
s: Extended;
begin
SetLength(L,n+1,n+1);
SetLength(d,n+1);
s:= 0;
for i:= 1 to n do
for j:= i+1 to n do
begin
s:= A[j][i];
for k:= 1 to i do
s:= s-L[i,k]*D[k]* L[j,k];
if (i = j) then
begin
D[i]:= s;//диагональный элемент
L[i,i]:= 1;//диагональ
end
else L[j,i]:= s/D[i];//внедиагональный элемент
end;
end;

Reply

nabbla1 December 25 2019, 14:14:20 UTC
Я брал пример с этого дела: https://people.sc.fsu.edu/~jburkardt/f77_src/asa007/asa007.html

когда всё это писалось, динамические массивы были редкостью, предпочитали всю эту конструкцию передать "одним куском", и в плане производительности это хорошо - заведомо всё рядом лежит, помещается сразу в кэш. Но адресация там ужасающая конечно...

Reply


ext_6383178 August 1 2023, 18:45:34 UTC
Вопрос от дилетанта: разложение Холецкого на множители LDLt позволяет избежать вычисления квадратных корней, делает ли это возможным применять данное разложение в отношении матрицы, не являющейся положительно определенной?

Reply

nabbla1 August 1 2023, 22:53:50 UTC

Квадратные корни здесь не нужны, да.

Само по себе LDLT-разложение допустимо для неотрицательно определённой матрицы, но я не проверял, сможет ли приведённый алгоритм это сделать, или "поделит на ноль" по чём зря. Возможно, придётся этот случай отдельно рассмотреть.

И пишут, что и более общего вида матрицы можно так раскладывать, главное, чтобы все её главные миноры были ненулевыми. Но и это не пробовал, не было необходимости.

Reply


Leave a comment

Up