Я студент и новичок в C. Мне нужно оптимизировать факторизацию cholesky, используемую в файле, на
https://github.com/RainerKuemmerle/g2o/blob/master/g2o/solvers/csparse/csparse_helper.cpp
для ARM с использованием векторизации и использования библиотеки Ne10.
Но мне трудно понять логику функции cs_chol_workspace. Функция возвращает указательную переменную N, которая не изменяется вообще внутри функции. Также, хотя я понимаю, что переменная L представляет собой факторизованную матрицу, что такое Lx, Li и Lp? Логика намного сложнее, чем мой уровень понимания.
Я пытался понять код за последние несколько дней. Любая помощь будет чрезвычайно заметной, поскольку я приближаюсь к своему крайнему сроку и до сих пор не повезло.
Функция возвращает указательную переменную N, которая не изменяется вообще внутри функции.
Не правда. Память выделяется для csn
, а ее адрес назначен N
в строке 96.
Также, хотя я понимаю, что переменная L представляет собой факторизованную матрицу, что такое Lx, Li и Lp?
Важная часть, чтобы понять это, как мы храним матрицу. Стандартный способ хранения матрицы - выделить достаточное количество памяти для хранения всех записей m * n
и получить к ним доступ как L_non_sparse[i][p]
. В этом случае структура данных предназначена для хранения разреженных матриц: то есть большая часть записей равна 0. Поэтому нам нужно только отслеживать, где находятся ненулевые записи. В строке 107 Lx
, Li
и Lp
определены как x
, i
и p
компоненты L
Поэтому мы обращаемся к ненулевым элементам L_non_sparse
по L_non_sparse[ Li[j] ][ Lp[j] ] = Lx[j]
.
Это основано на определениях в cs.h
csn
в заголовочном файле.