Линейная алгебра
Материал из CompVision
Содержание |
cvSetIdentity
void cvSetIdentity(CvArr* mat, CvScalar value=cvRealScalar(1));
Параметры:
- arr – Инициализируемая матрица (не обязательно квадратная)
- value – значение, присваиваемое диагональным элементам.
Инициализирует матрицу, как единичную матрицу, умноженную на число:
то есть, при j=i значение элемента равно value, иначе 0.
cvDotProduct
double cvDotProduct(const CvArr* src1, const CvArr* src2);
Параметры:
- src1 – Первая матрица
- src2 – Вторая матрица
Вычисляет скалярное произведение двух матриц в евклидовой метрике (обычное прямоугольное пространство :) ).
Возвращает число.
В случае многоканальных матриц, результаты для всех каналов объединяются. В частности, cvDotProduct(a,a) где a комплексный? (complex) вектор, возвратит
. Функция может обрабатывать многомерные массивы, строка за строкой, слой за слоем, и так далее.
cvCrossProduct
void cvCrossProduct(const CvArr* src1, const CvArr* src2, CvArr* dst);
Параметры:
- src1 – Первый перемножаемый вектор
- src2 – Второй перемножаемый вектор
- dst – Результирующий вектор
Возвращает векторное произведение двух трехмерных векторов.
если поэлементно, то так:
cvScaleAdd
// Определено так: #define cvMulAddS cvScaleAdd void cvScaleAdd(const CvArr* src1, CvScalar scale, const CvArr* src2, CvArr* dst);
Параметры:
- src1 – Первая исходная матрица
- scale – Масштабный фактор первой матрицы
- src2 – Вторая исходная матрица
- dst – Результирующая матрица
Вычисляет сумму матрицы, умноженной на число и другой матрицы.
Матрицы должны иметь одинаковые размеры и тип элементов.
cvGEMM
Операция обобщенного матричного умножения.
Производные функции
#define cvMatMulAdd( src1, src2, src3, dst ) cvGEMM( src1, src2, 1, src3, 1, dst, 0 ); #define cvMatMul( src1, src2, dst ) cvMatMulAdd( src1, src2, 0, dst );
void cvGEMM(const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0);
Параметры:
param src1: Первая исходная матрица param src2: Вторая исходная матрица param src3: Третья исходная матрица (смещение). Может быть NULL когда смещение не используется. param dst: Результирующая матрица param tABC: Флаги операции, который могут быть равны 0 или быть комбинацией следующих значений
- CV_GEMM_A_T - Транспонировать src1
- CV_GEMM_B_T - Транспонировать src2
- CV_GEMM_C_T - Транспонировать src3
где op может принимать вид:
Например, CV_GEMM_A_T+CV_GEMM_C_T соответствует функции:
Все матрицы должны иметь одинаковый тип элементов и правильные размеры (для проведения матричных операций). Действительный и комплексный тип элементов поддерживается данной функцией.
cvTransform
Применяет матричное преобразование к каждому элементу матрицы.
void cvTransform(const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL);
Параметры:
- src – Исходная матрица
- dst – Результирующая матрица
- transmat – трансформирующая матрица
- shiftvec – необязательный вектор сдвига
Каждый элемент N-канальной матрицы src рассматривается как N-элементный вектор преобразуется с использованием M x N матрицы transmat и вектора смещения shiftvec в элемент результирующей M-канальной матрицы dst. Существует возможность встраивания shiftvec в transmat. В этом случае transmat должен иметь размерность M x (N+1), где самый правый столбец считается вектором смещения. Исходная и результирующая матрицы должны иметь одинаковый размер (или иметь одинакового размера ROI) и количество каналов, тип ячейки shiftvec и transmat должен быть действительным.
Эта функция может быть использована для геометрических преобразований n - мерных наборов точек, независимых линейных преобразований цветового пространства, манипулирования каналами и т.д.
cvPerspectiveTransform
Производит перспективное матричное преобразование массива векторов, принимая каждый элемент матрицы src как двумерный или трехмерный вектор.
где
и w=w' если w' не равно 0, иначе w=(бесконечности :) )
void cvPerspectiveTransform(const CvArr* src, CvArr* dst, const CvMat* mat);
Параметры:
- src – Исходная трехканальная матрица с элементами действительного типа
- dst – Результирующая трехканальная матрица с элементами действительного типа
- mat – 3x3 или 4x4 матрица преобразования
cvMulTransposed
Возвращает произведение матрицы на её же транспонированную.
если order=0
или
в другом случае
void cvMulTransposed(const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL, double scale=1.0);
Параметры:
- src – исходная матрица
- dst – результирующая матрица. тип элемента должен быть CV_32F или CV_64F.
- order – порядок множителей (перемножение матриц не коммутативно)
- delta – необязательная матрица, вычитаемая из src перед умножением
- scale – необязательный масштабный фактор
cvTrace
Возвращает след матрицы (сумму элементов диагонали).
Параметры:
- mat - исходная матрица
CvScalar cvTrace(const CvArr* mat);
cvTranspose
Выполняет транспонирование матрицы:
dst(i,j)=src(j,i);
void cvTranspose(const CvArr* src, CvArr* dst);
Параметры:
- src - исходная матрица
- dst - результирующая матрица
Замечание: В случае комплексных матриц, комплексное сопряжение не производится. Сопряжени должно производиться отдельно: см. код примера к команде cvXorS().
cvDet
Возвращает определитель матрицы.
Параметры:
- mat - исходная матрица
double cvDet(const CvArr* mat);
Функция cvDet возвращает определитель квадратной матрицы mat. Для малоразмерных матриц используется прямой метод вычисления. Для матриц большого размера используется метод Гаусса. Для симметричных положительно-определенных матриц, возможно также запустить cvSVD() с U=V=0 и после этого вычислять определитель как произведение диагональных элементов W.
cvInvert
Имеет функцию-синоним cvInv:
#define cvInv cvInvertВозвращает матрицу обратную или псевдо-обратную заданной.
double cvInvert(const CvArr* src, CvArr* dst, int method=CV_LU);
Параметры:
- src – Исходная матрица
- dst – Результирующая обратная матрица
- method – Метод обращения может принимать значения:
* CV_LU - Метод Гаусса с выбранным главным элементом * CV_SVD - Метод сингулярного разложения (SVD). * CV_SVD_SYM - Метод сингулярного разложения (SVD) для симметричной положительно определенной матрицы
Функция cvInvert() обращает матрицу src1 и сохраняет результат в src2. В случае когда method=СМ_LU, функция возвращает определитель матрицы src1 (src1 должна быть квадратной). Если возвращен 0, операция обращения не удалась и src2 заполняется нулями.
В случае использования методов SVD, функция возвращает inversed condition of src1 (отношение наименьшего сингулярного значения к наибольшему сингулярному значению) и 0 если src1 заполнен нулями. SVD методы вычисляют псевдо-обратную матрицу матрицы если src1 сингулярная.
cvSolve
Находит решение системы линейных уравнений, точное или приближенное (методом наименьших квадратов).
int cvSolve(const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU);
Параметры:
- A – исходная матрица
- B – правая часть системы линейных уравнений
- X – результат (решение системы)
- method – Метод решения (обращения матрицы) может принимать значения:
- CV_LU - Метод Гаусса с выбранным главным элементом
- CV_SVD - метод сингулярного разложения
- CV_SVD_SYM - Метод сингулярного разложения (SVD) для симметричной положительно определенной матрицы
Функция cvSolve() находит точное решение или приближение по методу наименьших квадратов (последнее возможно при использовании метода сингулярного разложения (SVD)):
Если используется метод CV_LU, функция возвращает 1 если src1 не сингулярная матрица и 0 если сингулярная; в последнем случае dst не содержит правильных данных.
cvSVD
Производит сингулярное разложение матрицы (с элементами действительного типа)
void cvSVD(CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, int flags=0);
Параметры:
* A – Исходная матрица M x N
* W – Результирующая матрица MxN или NxN или вектор Nx1
* U – Необязательная левая прямоугольная матрица MxN или NxN. Если установлен флаг CV_SVD_U_T количество срок и столбцов в предыдущем предложении поменяются местами.
* V – Необязательная правая прямоугольная матрица (NxN)
* flags – флаги. Может быть 0, или принимать значения (можно суммировать):
o CV_SVD_MODIFY_A - разрешает изменение матрицы src1 в ходе операции. Это ускоряет процесс.
o CV_SVD_U_T - означает что матрица U будет возвращена в транспонированном виде. Это тоже ускоряет процесс.
o CV_SVD_V_T - означает что матрица V будет возвращена в транспонированном виде. Это тоже ускоряет процесс.
Функция cvSVD() проводит разложение матрицы A на произведение диагональной матрицы и двух прямоугольных матриц:
cvSVBkSb
Производит обратную подстановку значений, полученных при сингулярном разложении.
void cvSVBkSb(const CvArr* W, const CvArr* U, const CvArr* V, const CvArr* B, CvArr* X, int flags)
Параметры:
* W – Матрица или вектор сингулярных значений * U – Левая ортогональная матрица (может быть транспонированной) * V – Правая ортогональная матрица (может быть транспонированной) * B – Матрица, на которую умножается псевдоинверсия матрицы A. Это необязательный параметр. Еси он опущен, то принимается равным единичной матрице подходящего размера (таким образом X будет повторять псевдоинверсию матрицы A). * X – Результат обратной подстановки * flags – Флаги операции, должны точно совпадать с флагами cvSVD()
Функция cvSVBkSb() выполняет обратную подстановку для разложенной матрицы A (см. описание cvSVD()) и матрицы B:
если
, иначе
.
где - малая величина, зависящая от типа данных ячейки матрицы.
Эта функция, вместе с cvSVD() используется в функциях cvInvert() и cvSolve(), и возможные причины использовать эти (svd и bksb) функции "низкого уровня", избежать выделения временных матриц в функция х более высокого уровня (таких как inv and solve).
cvEigenVV
Вычисляет собственные значения и собственные векторы симметричной матрицы.
void cvEigenVV(CvArr* mat, CvArr* evects, CvArr* evals, double eps=0, int lowindex = 0, int highindex = 0);
Параметры:
* mat – Входная симметричная квадратная матрица, изменяется в процессе работы * evects – выходная матрица собственных векторов, хранящаяся как последовательность строк. * evals – выходной вектор собственных значений, значения хранятся в убывающем порядке (порядок собственных значений соответствует порядку хранения собственных векторов) * eps – точность диагонализации. Обычно принимается равным DBL_EPSILON (около 10E-15). В настоящее время, этот параметр не задействован. * lowindex – Необязательный индекс наибольшего собственного значения/вектора для вычисления. (см.далее.) * highindex – Необязательный индекс наименьшего собственного значения/вектора для вычисления. (см.далее.)
Функция cvEigenVV() вычисляет собственные значения и собственные векторы матрицы A:
mat*evects(i,:)' = evals(i)*evects(i,:)' (в виде MATLAB)
Если задан один из параметров low- или highindex, то нужно определить и второй. Индексация начинается с 1. Пример: Для вычисления наибольшей пары собственного вектора/-значения lowindex = highindex = 1. Из соображений совместимости функция всегда возвращает квадратную матрицу того же размера что и исходная матрица. Выбранные значения всегда находятся впервых highindex - lowindex + 1 строках.
Содержимое матрицы A после работы функции теряется.
На настоящий момент функция работает медленнее чем cvSVD() но немного более точно, так что если известно что A положительно определена (например это матрица ковариации) рекомендуется использовать cvSVD для поиска собственных значений/векторов A , особенно если не требуется искать собственные векторы.
cvCalcCovarMatrix
Вычисляет матрицу ковариации ряда векторов.
void cvCalcCovarMatrix(const CvArr** vects, int count, CvArr* cov_mat, CvArr* avg, int flags);
Параметры:
- vects - входные векторы, у которых должен быть одинаковый тип размер. Векторы не обязательно должны быть одномерными, они могут быть двумерными (например, изображения) и т.д
- count - количество входных векторов
- cov_mat - матрица ковариации результата, которая должна иметь тип элемента с плавающей точкой и быть квадратной
- avg - вход или результат (в зависимости от флагов) матрица - средний вектор входных векторов
- flags - Флаги операции, комбинация следующих значений:
- CV_COVAR_SCRAMBLED - матрица ковариации результата вычислена как:
, то есть, матрица ковариации размером count x count. Такая необычная матрица ковариации используется для быстрого PCA-анализа набора очень больших векторов (см., например, метод распознавания лиц EigenFaces (собственные лица)). Собственные значения этой "скремблированной" матрицы будут соответствовать собственным значениям истинной матрицы ковариации, и "истинные" собственные векторы могут быть легко вычислены исходя из собственных векторов "скремблированной" матрицы ковариации.
- CV_COVAR_NORMAL - матрица ковариации результата вычислена как:
, то есть, cov_mat будет матрицей ковариации с теми же самыми линейными размерами (ширина и высота) как общее количество элементов в каждом входном векторе. Один и только один из CV_COVAR_SCRAMBLED и CV_COVAR_NORMAL должен быть определен.
- CV_COVAR_USE_AVG - Если флаг определен, функция, не вычисляет среднего от входных векторов, а, вместо этого, использует переданное в качестве прарметра значение avg. Это полезно, если усредненный вектор уже был вычислен заранее, или если матрица ковариации вычисляется по частям - в этом случае, avg не средний вектор входного подмножества (частей по ктороым вычисляется общая матрица) векторов, а средний вектор всего набора векторов.
- CV_COVAR_SCALE - Если флаг определен, матрица ковариации масштабируется. В "обычном" случае масштаб '1/count'; в "скремблированном" способе масштаб есть обратная величина общего количества элементов в каждом входном векторе. По умолчанию (если флаг не определен) матрица ковариации не масштабируется ('scale=1').
- CV_COVAR_ROWS - Означает, что все входные векторы хранятся как строки одной матрицы vects [0]. count в этом случае игнорируется, avg - должен быть вектором-строкой соответствующего размера.
- CV_COVAR_COLS - Означает, что все входные векторы хранятся как столбцы одной матрицы vects [0]. count в этом случае игнорируется, avg - должен быть вектором-столбцом соответствующего размера.
Функция cvCalcCovarMatrix () вычисляет матрицу ковариации и, по необходимости, средний вектор множества входных векторов. Функция может использоваться для PCA, для сравнения векторов обычно используется расстояние Махаланобиса (Mahalanobis) и т.д.
cvMahalanobis
Вычисляет расстояние Махаланобиса между двумя векторами.
double cvMahalanobis(const CvArr* vec1, const CvArr* vec2, CvArr* mat);
Параметры:
* vec1 - первый 1D исходный вектор * vec2 - второй 1D исходный вектор * mat - обратная матрица ковариации
Функция cvMahalonobis () вычисляет и возвращает расстояние между двумя векторами:
Матрица ковариации может быть вычислена при помощи функции cvCalcCovarMatrix () и далее инвертирована при помощи cvInvert () (метод CV_SVD - предпочтительный, т.к. матрица может быть сингулярной).