Карта посещений

Счетчики

Реклама Google

 

Линейная алгебра

Материал из CompVision

Перейти к: навигация, поиск

Линейная алгебра

Содержание

cvSetIdentity

void cvSetIdentity(CvArr* mat, CvScalar value=cvRealScalar(1));

Параметры:

  • arr – Инициализируемая матрица (не обязательно квадратная)
  • value – значение, присваиваемое диагональным элементам.


Инициализирует матрицу, как единичную матрицу, умноженную на число:

LaTeX: mat=\left[ \begin{matrix}
</p>
<pre>  value & 0 & 0  \\
  0 & value & 0  \\
  0 & 0 & value  \\
</pre>
<p>\end{matrix} \right]

то есть, при j=i значение элемента равно value, иначе 0.

cvDotProduct

double cvDotProduct(const CvArr* src1, const CvArr* src2);

Параметры:

  • src1 – Первая матрица
  • src2 – Вторая матрица

Вычисляет скалярное произведение двух матриц в евклидовой метрике (обычное прямоугольное пространство :) ).

Возвращает число.

LaTeX: src1\cdot src2=\sum\limits_{I}{(src1(I)\cdot src2(I))}

В случае многоканальных матриц, результаты для всех каналов объединяются. В частности, cvDotProduct(a,a) где a комплексный? (complex) вектор, возвратит LaTeX: {{\left\| a \right\|}^{2}} . Функция может обрабатывать многомерные массивы, строка за строкой, слой за слоем, и так далее.

cvCrossProduct

void cvCrossProduct(const CvArr* src1, const CvArr* src2, CvArr* dst);

Параметры:

  • src1 – Первый перемножаемый вектор
  • src2 – Второй перемножаемый вектор
  • dst – Результирующий вектор

Возвращает векторное произведение двух трехмерных векторов.

LaTeX: dst=src1\times src2

если поэлементно, то так:

LaTeX: \begin{align}
</p>
<pre> & ds{{t}_{1}}=src{{1}_{2}}src{{2}_{3}}-src{{1}_{3}}src{{2}_{2}} \\ 
& ds{{t}_{2}}=src{{1}_{3}}src{{2}_{1}}-src{{1}_{1}}src{{2}_{3}} \\ 
& ds{{t}_{3}}=src{{1}_{1}}src{{2}_{2}}-src{{1}_{2}}src{{2}_{1}} \\ 
</pre>
<p>\end{align}

cvScaleAdd

// Определено так:
#define cvMulAddS cvScaleAdd
 
void cvScaleAdd(const CvArr* src1, CvScalar scale, const CvArr* src2, CvArr* dst);

Параметры:

  • src1 – Первая исходная матрица
  • scale – Масштабный фактор первой матрицы
  • src2 – Вторая исходная матрица
  • dst – Результирующая матрица

Вычисляет сумму матрицы, умноженной на число и другой матрицы.

LaTeX: dst(I)=scale\cdot src1(I)+src2(I)

Матрицы должны иметь одинаковые размеры и тип элементов.

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

LaTeX: dst=alpha\cdot op(src1)\cdot op(src2)+beta\cdot op(src3)

где op может принимать вид:

LaTeX: \begin{align}
</p>
<pre> & op(X)=X \\ 
& op(X)={{X}^{T}} \\ 
</pre>
<p>\end{align}


Например, CV_GEMM_A_T+CV_GEMM_C_T соответствует функции:

LaTeX: dst=alpha\cdot src{{1}^{T}}\cdot src2+beta\cdot src{{3}^{T}}

Все матрицы должны иметь одинаковый тип элементов и правильные размеры (для проведения матричных операций). Действительный и комплексный тип элементов поддерживается данной функцией.

cvTransform

Применяет матричное преобразование к каждому элементу матрицы.

LaTeX: dst(I)=transmat\cdot src(I)+shiftvec

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 как двумерный или трехмерный вектор.

LaTeX: (x,y,z)\to \left( \frac{{{x}'}}{w},\frac{{{y}'}}{w},\frac{{{z}'}}{w} \right)

где

LaTeX: ({x}',{y}',{z}',{w}')=mat\cdot [x,y,z,1]

и w=w' если w' не равно 0, иначе w=(бесконечности :) )

void cvPerspectiveTransform(const CvArr* src, CvArr* dst, const CvMat* mat);

Параметры:

  • src – Исходная трехканальная матрица с элементами действительного типа
  • dst – Результирующая трехканальная матрица с элементами действительного типа
  • mat – 3x3 или 4x4 матрица преобразования

cvMulTransposed

Возвращает произведение матрицы на её же транспонированную.

если order=0

LaTeX: dst=scale(src-delta){{(src-delta)}^{T}}

или

LaTeX: dst=scale{{(src-delta)}^{T}}(src-delta)

в другом случае


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

Возвращает след матрицы (сумму элементов диагонали).

LaTeX: tr=\sum\limits_{i}{mat(i,i)}

Параметры:

  • 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)):

LaTeX: dst=\arg {{\min }_{X}}\left\| src1\cdot X-src2 \right\|

Если используется метод 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 на произведение диагональной матрицы и двух прямоугольных матриц:

LaTeX: A=UW{{V}^{T}}

Сингулярное разложение

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:

LaTeX: X=V{{W}^{-1}}{{U}^{T}}B


LaTeX: W_{(i,i)}^{-1}=1/{{W}_{(i,i)}} если LaTeX: {{W}_{(i,i)}}>\varepsilon \sum\limits_{i}{{{W}_{(i,i)}}} , иначе LaTeX: {{W}_{(i,i)}}=0.

где LaTeX: \varepsilon - малая величина, зависящая от типа данных ячейки матрицы.

Эта функция, вместе с 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 - матрица ковариации результата вычислена как:

LaTeX: \operatorname{cov}\_mat=scale\cdot {{[vects[0]-avg,vects[1]-avg,...]}^{T}}\cdot [vects[0]-avg,vects[1]-avg,...]

, то есть, матрица ковариации размером count x count. Такая необычная матрица ковариации используется для быстрого PCA-анализа набора очень больших векторов (см., например, метод распознавания лиц EigenFaces (собственные лица)). Собственные значения этой "скремблированной" матрицы будут соответствовать собственным значениям истинной матрицы ковариации, и "истинные" собственные векторы могут быть легко вычислены исходя из собственных векторов "скремблированной" матрицы ковариации.

  • CV_COVAR_NORMAL - матрица ковариации результата вычислена как:

LaTeX: \operatorname{cov}\_mat=scale\cdot [vects[0]-avg,vects[1]-avg,...]\cdot {{[vects[0]-avg,vects[1]-avg,...]}^{T}}

, то есть, 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 () вычисляет и возвращает расстояние между двумя векторами:

LaTeX: \text{d}(\text{vec1}\text{,vec2)=}\sqrt{\sum\limits_{i,j}{(ma{{t}_{i,j}}\cdot (vec{{1}_{i}}-vec{{2}_{i}})\cdot }(vec{{1}_{j}}-vec{{2}_{j}}))}

Матрица ковариации может быть вычислена при помощи функции cvCalcCovarMatrix () и далее инвертирована при помощи cvInvert () (метод CV_SVD - предпочтительный, т.к. матрица может быть сингулярной).

 
Последние посты форума