OPENCV的MAT类详解.docx_第1页
OPENCV的MAT类详解.docx_第2页
OPENCV的MAT类详解.docx_第3页
OPENCV的MAT类详解.docx_第4页
OPENCV的MAT类详解.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

资料收集于网络 如有侵权请联系网站 删除 谢谢 类 Mat导言OpenCV c + + n 维稠密数组类类 CV_EXPORTS Matpublic:/ / 很多的方法./*!包括几位字段:-神奇的签名-连续性标志-深度(Note:应该是位深)-通道数*/int flags;(Note :目前还不知道flags做什么用的)/!数组的维数, = 2int dims ;/!行和列的数量或 (-1,-1) 此时数组已超过 2 维int rows,cols;/!指向数据的指针uchar *data ;/!指针的引用计数器 ;/ / 阵列指向用户分配的数据时,当指针为 NULLint * refcount ;/ / 其他成员.;Mat类表示一个 n 维的密集数值单通道或多通道数组。它可以用于存储实数或复数值的向量和矩阵、灰度或彩色图像、体素、向量场、点云、张量、直方图 (尽管较高维的直方图存储在SparseMat可能更好)。M 数组的数据布局是由阵列 M.step定义的,使元素的地址(i0,。iM.dims-1),其中 0= ik =M.stepi+1 (事实上,M.stepi =M.stepi+1*M.sizei+1)。这意味着2维矩阵是按行存储的,3 维矩阵是由平面存储,以此类推。M.stepM.dims-1 是最小的而且总是等于元素大小M.elemSize()。因此,Mat中的数据布局完全兼容OpenCV 1.x 中CvMat、 IplImage、 CvMatND类型。它也和标准工具包和SDK,如Numpy(ndarray),Win32(独立设备位图)等主流的密集数组类型相兼容,也就是说,与任何使用步进(或步长)来计算像素位置的阵列相兼容。由于这种兼容性,使用户分配的数据创建Mat头以及用OpenCV函数实时处理该头成为可能。有很多不同的方法,创建一个Mat的对象。下面列出了最常见的选项:使用 create(nrows,ncols,type)方法或类似的Mat(nrows,ncols,type ,fillValue)构造函数。一个新的指定了大小和类型的数组被分配。type和cvCreateMat 方法中的type参数具有相同的含义。例如,CV_8UC1 是指一个 8 位单通道阵列,CV_32FC2 指 2 通道(复)浮点阵列,以此类推。/创建一个用1+3j填充的 7 x 7 复矩阵。Mat M(7,7,CV_32FC2,Scalar(1,3) ;/ /现在将 M转换为100 x 60的CV_8UC(15)的矩阵。/ / 旧内容将会被释放M.create(100,60,CV_8UC(15) ;这一章导言中指出,当当前的数组与指定的数组的形状或类型create() 分配唯一的新数组时的形状或类型。创建多维数组:/ / 创建 100 x 100 x 100 8 位数组int sz = 100, 100, 100;Mat. bigCube (3,sz,CV_8U,Scalar:all(0) ;它将维度数(= 1)传递给Mat的构造函数,但列数设置为 1时,创建数组将是 2 维的。因此,Mat:dims 始终是=2的(该数组为空时,也可以是 0)。使用的复制构造函数或赋值运算符可以是一个数组或右侧的表达式(请参阅下图)。正像在导言中指出的,数组赋值运算复杂度是O(1)因为当你需要它的时候,它仅复制头和增加引用计数。Mat:clone() 方法可用于获取全(深)的副本数组。为另一个数组的一部分构建头。它可以是单个行、 单个列,几个行,几个列,矩形区域(代数中称为较小值) 的数组或对角线。这种操作也是复杂度为O(1),因为,新头引用相同的数据。实际上,您可以使用此特性修改该数组的一部分例如:/ /第 5行,乘以 3,加到第 3 行,M.row(3) = M.row(3) + M.row (5) * 3 ;/ / 现在将第7列复制到第1列/ / M.col(1) = M.col(7) ;/ / 这个不能实现。Mat M1= M.col(1) ;M.col(7).copyTo(M1) ;/ / 创建一种新的 320 x 240 图像Mat img(Size(320,240),CV_8UC3) ;/ / 选择ROI(region of interest)Mat roi(img,Rect(10,10,100,100) ;/ / 填充 (0,255,0) 的ROI (这是RGB 空间中的绿色);/ / 320 x 240 原始图像将被修改。roi = Scalar(0,255,0) ;由于额外的 datastart 和 dataend 的成员,它们使得用locateROI() 计算子数组在主容器数组中的相对的位置成为可能:Mat A = Mat:eye ( 10, 10, CV_32S);/ / 提取 A 的1 (含)到 3 (不包含)列。Mat B = A(Range:all(),Range(1,3) ;/ / 提取 B 的5 (含)到 9 (不包含)行。/ /即 C A(Range(5,9),Range (1,3)Mat C = B(Range(5,9),Range:all() ;Size size;Point ofs;C.locateROI (size,ofs);/ / size将变为 (width= 10,height= 10),ofs会变为 (x = 1,y = 5)考虑到整个矩阵,如果您需要深层副本,使用子矩阵的sclone() 方法的提取。为用户分配数据创建矩阵头。有利于执行下列操作:1. 使用 OpenCV处理外来的数据(例如,当您执行 DirectShow *lter 或 gstreamer的pro-cessing 模块,等等)。例如:void process_video_frame (const unsignedchar * pixels,int width,int height,int step)Mat img (width,height, CV_8UC3,pixels,step);GaussianBlur (img,img ,Size(7,7),1.5,1.5) ;2.快速初始化小矩阵和/或获取超快的元素的访问。double m3 3 = a,b,c,d,e,f g, h, i;Mat M = Mat(3,3,CV_64F,m).inv() ;本例中用户分配数据的一些很常见情况是从CvMat 和 IplImage 转换到Mat。为达到此目的,有些特殊的构造函数以指向CvMat 或 IplImage 和ag可选参数指示是否数据复制。从Mat到 CvMat 或 IplImage 的后台转换是通过类型转换运算符 Mat:operator CvMat() const 和 Mat:operator IplImage()实现的。operators不要复制数据。IplImage * img = cvLoadImage(greatwave.jpg,1) ;Mat mtx(img) ;/ / IplImage *- MatCvMat oldmat = mtx ;/ / Mat- CvMatCV_Assert (oldmat.cols = = img- width& oldmat.rows = = img- height & &oldmat.data.ptr = = (uchar *) img-imageData & & oldmat.step = = img- widthStep);使用 MATLAB 样式数组初始值设定项zeros()、 ones()、 eye(),例如:/ / 创建具双精度标识矩阵并将其添加到M。M + = Mat:eye (M.rows,M.cols,CV_64F);使用逗号分隔的初始值设定项:/ / 创建 3 x 3 双精度恒等矩阵Mat M = (Mat_ (3,3) 1,0,0,0,1,0,0,0,1) ;使用此方法,您首先调用具有适当的参数的 Mat_类构造函数,然后只要把 运算符后面的值用逗号分隔,这些值可以是常量、变量、 表达式,等等。此外请注意所需的额外的圆括号((Mat_ (3,3) 1,0,0,0,1,0,0,0,1)以免出现编译错误。数组一旦创建起来,它可以自动通过引用计数的机制被管理。如果数组头是在用户分配的数据的基础上构建的,您应该自己处理这些数据。当没有指向它的引用时,数组中的数据将被释放。如果在数组的析构函被调用之前要释放一个由矩阵头指向的数据,请使用Mat:release()。掌握Array类的另一个重要的环节是元素的访问。本手册已经描述了如何计算每个数组元素的地址。通常情况下,不需要在代码中直接使用的公式。如果你知道数组元素类型(它可以使用 Mat:type() 方法检索得到),您可以用以下方式访问二维数组的元素Mij:M.at (i,j) + = 1.f ;假定 M 一个双精度浮点型数组。有几个变体的不同方法来针对不同的维度数进行处理。如果您要处理整行的二维数组,最有效的方式是获取该行的头指针然后只需使用普通的 C运算符:/ / 正矩阵元素之和计算/ / (假定M 是一个双精度矩阵)double sum = 0;for (int i = 0 ;i M.rows ; i + +)const double *Mi = M.ptr (i) ; for (int j = 0; j M.cols ; j + +)sum + = std:max(Mi j,0.) ;以上的操作中,某些操作实际上不依赖该数组的形状。他们只是一个接一个(或多个具有相同的坐标的多个数组中的元素,例如,数组相加)地处理数组元素。这种操作称为 元素指向(element-wise)。检查是否所有的输入/输出阵列是连续的,即有没有间断在每行的结尾,是有意义的。如果是的话,将它们(这些数组)作为单独的一个长行来处理:/ / 计算正矩阵元素,优化的变量的总和double sum = 0;int cols =M.cols,rows = M.rows ;if(M.isContinuous() cols * = rows ; rows = 1 ;for (int i = 0 ;i rows; i + +)const double * Mi = M.ptr (i) ;for (int j = 0; j cols ; j +)sum + = std:max (Mi j,0.) ;对于连续的矩阵来说,外部循环体只需一次执行。所以,开销是规模较小,小型矩阵的情况下尤其明显。最后,还有足以成功跳过连续的行之间的间隔智能的STL 样式迭代器:/ / 计算正矩阵元素和基于迭代器类型的变量之和double sum = 0;Mat Const Iterator_ it =M.begin (),it_end = M.end () ;for(; it! = it_end ; +it)sum+ = std:max (*it,0.);矩阵迭代器是随机存取的迭代器,所以他们可以被传递给任何 STL 算法,包括 std:sort()。矩阵表达式这是已经实现的可以组合在任意复杂的表达式中的矩阵运算操作, (此处 A 、B 的表示矩阵 (Mat)、 s表示标量(Scalar),alpha为实数标量 (双精度型): 加法、减法、求反: A + B + A-B、 A + s、 A-s、 s + A、 s-A、-A; 缩放: A * 阿尔法 每个元素乘法和除法: A.mul (B)、 A / B,alpha/A 矩阵相乘: A * B 大动脉转位: A.t() (指在)矩阵反演和伪反演,求解线性系统和最小二乘问题:A.inv(method) ( A-1) , A.inv(method)*B ( X: AX=B) 比较: cmpop B、 cmpop alpha、 alpha cmpop A,其中 cmpop 是以下几种运算符之一: , =,= =,! =, =,。比较的结果是其元素设置为 255的 8 位单通道掩码(如果特殊元素对满足条件) 或 0。 按位逻辑运算: logicop B、 logicop s slogicop A、 A,其中 logicop 是以下运算符之一: &,|, . 元素的最小值和最大值:分 (A、 B)、 民 (,alpha),最大值 (A,B),最大 (,alpha) 元素的绝对价值: abs(A) 叉乘,点乘: A.cross(B) A.dot(B) 任何标量与矩阵或矩阵的函数,返回一个矩阵或标量(scalar),如norm、, mean、 sum、countNonZero、trace、determinant、repeat和其他。 矩阵初始值设定项(Mat:eye(),Mat:zeros(),Mat:ones())、矩阵以逗号分隔的初始值设定项、可提取sub-matrices的m atrix构造函数和运算符,(请参见Mat的说明)。 Mat_ () 构造函数将结果强制转换为适当的类型。Note:有些逗号分隔初始值设定项和一些其他的运算符可能需要显示调用Mat();或Mat_();的构造函数来解决可能产生的歧义。 以下是一些矩阵表达式的例子:/计算矩阵A的伪反演等价于A.inv(DECOMP_SVD)SVD svd(A);Mat pinvA =svd.vt.t()*Mat:diag(1./svd.w)*svd.u.t();/计算莱文伯格-马夸特算法中的参数的新向量x -= (A.t()*A +lambda*Mat:eye(A.cols,A.cols,A.type().inv(DECOMP_CHOLESKY)*(A.t()*err);/用“Unsharp Mask”算法锐化图像Mat blurred; double sigma = 1, threshold =5, amount = 1;GaussianBlur(img, blurred, Size(), sigma,sigma);Mat lowConstrastMask = abs(img - blurred) threshold;Mat sharpened = img*(1+amount) +blurred*(-amount);img.copyTo(sharpened, lowContrastMask);下面正式讲解Mat的各种方法。Mat:Mat各种Mat构造函数。C+: Mat:Mat()C+: Mat:Mat(int rows, int cols, int type)C+: Mat:Mat(Size size, int type)C+: Mat:Mat(int rows, int cols, int type,const Scalar& s)C+: Mat:Mat(Size size, int type, constScalar& s)C+: Mat:Mat(const Mat& m)C+: Mat:Mat(int rows, int cols, int type,void* data, size_t step=AUTO_STEP)C+: Mat:Mat(Size size, int type, void*data, size_t step=AUTO_STEP)C+: Mat:Mat(const Mat& m, constRange& rowRange, const Range& colRange)C+: Mat:Mat(const Mat& m, constRect& roi)C+: Mat:Mat(const CvMat* m, boolcopyData=false)C+: Mat:Mat(const IplImage* img, boolcopyData=false)C+: templateexplicit Mat:Mat(const Vec& vec, bool copyData=true)C+: template explicit Mat:Mat(const Matx& vec, bool copyData=true)C+: template explicitMat:Mat(const vector& vec, bool copyData=false)C+: Mat:Mat(const MatExpr& expr)C+: Mat:Mat(int ndims, const int* sizes,int type)C+: Mat:Mat(int ndims, const int* sizes,int type, const Scalar& s)C+: Mat:Mat(int ndims, const int* sizes,int type, void* data, const size_t* steps=0)C+: Mat:Mat(const Mat& m, constRange* ranges)参数ndims 数组的维数.rows 2维数组中行行数cols Number of columnsin a 2D array.size 2维数组的尺寸Size(cols, rows) .在Size()构造函数中行数和列数在次序上刚好反转过来了。sizes指定 n 维数组形状的整数数组。type数组的类型。使用 CV_8UC1, ,创建 1-4 通道的矩阵,CV_64FC4 或CV_8UC(n), ,CV_64FC(n)可以创建多通道 (高达 CV_MAX_CN 通道)矩阵。s一个可选的初始化每个矩阵元素的参数。要在矩阵建成后将所有元素设置为特定值可以用Mat的赋值运算符Mat:operator=(constScala& value)。data指向用户数据的指针。矩阵构造函数传入data和step参数不分配矩阵数据。相反,它们只是初始化矩阵头指向指定的数据,这意味着没有数据的复制。此操作是很高效的,可以用来处理使用 OpenCV 函数的外部数据。外部数据不会自动释放,所以你应该小心处理它。step每个矩阵行占用的字节数。如果任何值应包括每行末尾的填充字节。如果缺少此参数(设置为 AUTO_STEP),假定没有填充和实际的步长用cols*elemSize()计算。请参阅Mat:elemSize()。steps多维数组(最后一步始终设置为元素大小) 的情况下的 ndims-1个步长的数组。如果没有指定的话,该矩阵假定为连续。m分配给构造出来的矩阵的阵列(作为一个整体或部分)。这些构造函数没有复制数据。相反,指向 m 的数据或它的子数组的头被构造并被关联到m上。引用计数器中无论如何都将递增。所以,当您修改矩阵的时候,自然而然就使用了这种构造函数,您还修改 m 中的对应元素。如果你想要独立的子数组的副本,请使用 Mat:clone()。img指向老版本的 IplImage图像结构的指针。默认情况下,原始图像和新矩阵之间共享数据。但当 copyData 被设置时,完整的图像数据副本就创建起来了。vec矩阵的元素构成的STL 向量。矩阵可以取出单独一列并且该列上的行数和矢量元素的数目相同。矩阵的类型匹配的向量元素的类型。构造函数可以处理任意的有正确声明的DataType类型。这意味着矢量元素不支持的混合型结构,它们必须是数据(numbers)原始数字或单型数值元组。对应的构造函数是显式的。由于 STL 向量不会自动转换为Mat实例,您应显式编写 Mat(vec)。除非您将数据复制到矩阵 (copyData = true),没有新的元素被添加到向量中,因为这样可能会造成矢量数据重新分配,并且因此使得矩阵的数据指针无效。copyData指定STL 向量或旧型 CvMat 或 IplImage是应复制到 (true)新构造的矩阵中 还是 (false) 与之共享基础数据的标志,复制数据时,使用Mat引用计数机制管理所分配的缓冲区。虽然数据共享的引用计数为 NULL,但是分配数据必须在矩阵被析构之后才可以释放。rowRange m 的行数的取值范围。正常情况下,范围开始端具有包容性和范围结束端是独占的。使用 Range:all() 来取所有的行。colRangem 列数的取值范围。使用 Range:all() 来取所有的列。ranges表示M沿每个维度选定的区域的数组。expr 矩阵表达式。请参见矩阵表达式。以上这些都是Mat形成一个矩阵的各类构造函数。如输出数据的自动分配中所提到的,往往默认构造函数就足够了,不同的矩阵可以由 OpenCV 函数来分配数据空间。构造的矩阵可以进一步分配给另一个矩阵或矩阵表达或通过Mat:create()获配。在前一种情况,旧的内容是间接引用的。Mat:MatMat的析构函数。C+: Mat:Mat()析构函数调用Mat:release()。Mat:operator =提供矩阵赋值操作。C+: Mat& Mat:operator=(const Mat& m)C+: Mat& Mat:operator=(const MatExpr_Base& expr)C+: Mat& Mat:operator=(const Scalar& s)参数:m 被赋值的右侧的矩阵。 矩阵的赋值是一个复杂度为O(1) 的操作。 这就意味着没有数据段复制并且有数量的递增两矩阵将使用同一引用计数器。在给矩阵赋新数据之前先由Mat:release()释放引用。expr被赋值的矩阵表达式对象。 作为第一种赋值方式的逆操作第二种形式可以被重新用到具有适当大小和尺寸的已分配空间的矩阵上以适应表达式的结果。矩阵表达式扩展得到的实函数将自动处理这个分配过程。例如:C=A+B 扩展成add(A, B, C) , andadd() 要当心C重新分配数据的操作。.s 标量赋值给每一个矩阵元,矩阵的大小和类型将不会改变。有现成的赋值运算符。由于他们各不相同请阅读运算符参数说明。Mat:operator MatExpr提供一种Mat-to-MatExpr转换运算符C+: Mat:operator MatExpr_() const转换运算符不能显示调用而是由矩阵表达式引擎(Matrix Expression engine)内部调用The cast operator should not be called explicitly. It is used internally by the Matrix Expressions engine.Mat:row创建一个指定行数的矩阵头。.C+: Mat Mat:row(int i) const参数:i 一个0基的行索引.该方法创建一个具有指定了行数的新矩阵头的矩阵并返回它。这是一个复杂度为O(1) 的操作,无须考虑矩阵的尺寸。新矩阵和原矩阵共享一份基础数据。这是一个典型基本矩阵处理操作的例子, axpy是LU和许多其它算法都使用的一个函数inline void matrix_axpy(Mat& A, int i, int j, double alpha)A.row(i) += A.row(j)*alpha;Note:在当前实现中,下面的代码不会无法按预期的效果工作:Mat A ;.A.row(i) = A.row(j) ;/ /不起作用发生这种情况是因为 A.row(i) 形成临时矩阵头进一步分配给另一个矩阵头。请记住,每个操作复杂度为O(1),即没有复制任何数据。因此,如果你预期第 j行被复制到第 i行,那么上述赋值不成立。要做到这一点,应该把这种简单的赋值转换到表达式中或使用 Mat:copyTo() 方法:Mat A ;./ / 可行,但看上去有点目的不明确。A.row(i) = A.row(j) + 0;/ / 这是有点儿长,但这是推荐的方法。A.row(j).copyTo(A.row(i) ;Mat:col创建一个具有指定了矩阵头中列数这个参数的矩阵C+: Mat Mat:col(int j) const参数:j一个0基(从0开始)的列索引该方法创建一个具有指定了矩阵头中列数这个参数的新矩阵并作为函数返回值。这是一种复杂度为O(1)的操作,不用考虑矩阵的尺寸大小。新矩阵和原始矩阵共享一份基础数据。参看Mat:row()说明信息。Mat:rowRange为指定的行span创建一个新的矩阵头。C+: Mat Mat:rowRange(int startrow, int endrow) constC+: Mat Mat:rowRange(const Range& r) const参数:startrow 一个包容性的0基(从0开始)的行span起始索引.。endrow 一个0基的独占性的行span.终止索引。r Range 结构包含着起始和终止的索引值。该方法给矩阵指定的行span创建了新的头。 与Mat:row() 和 Mat:col()相类似这是一个复杂度为O(1)的操作。Mat:colRange为指定的行span创建一个矩阵头。C+: Mat Mat:colRange(int startcol, int endcol) constC+: Mat Mat:colRange(const Range& r) const参数:startcol 一个包容性的0基(从0开始)的span列起始索引。endcol一个0基的独占性的列span.终止索引。rRange 结构包含着起始和终止的索引值。该方法给矩阵指定的列span创建了新的头。 与Mat:row() 和 Mat:col()相类似这是一个复杂度为O(1)的操作。Mat:diag提取或创建矩阵对角线。C+: Mat Mat:diag(int d) constC+: static Mat Mat:diag(const Mat& matD)参数:d 对角线的索引值,可以是以下的值: d=0 是主对角线 d0表示下半部的对角线。例如:d=1对角线是紧挨着住对角线并位于矩阵下方。 dsize(), this-type);因此,目标矩阵会在必要的情况下重新分配尽管m.copyTo(m) works awlessly,该函数并不处理源矩阵和目标矩阵之间有重叠的部分的情况。当操作掩码指定以及上述的Mat:create重新分配矩阵,新分配的矩阵在数据复制到里面之前全都被初始化为。Mat:convertTo在缩放或不缩放的情况下转换为另一种数据类型。C+:void Mat:convertTo(OutputArray m,int rtype,double alpha=1,double beta=0)const参数:m 目标矩阵。如果它的尺寸和类型不正确,在操作之前会重新分配。in danger (of) 在危险中;垂危rtype 要求是目标矩阵的类型,或者在当前通道数与源矩阵通道数相同的情况下的depth。如果rtype 为负,目标矩阵与源矩阵类型相同。beta 可选的delta加到缩放值中去。该方法将源像素值转化为目标类型saturate_cast 要放在最后以避免溢出m( x;y) = saturate_cast ( *( *this)( x;y) +)Mat:assignTo提供了一个convertTo的功能形式。C+: void Mat:assignTo(Mat& m, int type=-1 ) constParametersm 目标阵列。type 要求是目标阵列depth或(如果阵列的类型和源矩阵类型相同)这是一个 internally 使用的由 Matrix Expressions引擎调用的方法。Mat:setTo将阵列中所有的或部分的元素设置为指定的值。C+: Mat& Mat:setTo(const Scalar& s, InputArray mask=noArray()参数:s 把标量赋给阵列并转化到阵列的实际类型。mask 与 *this尺寸相同的操作掩码。这是Mat:operator=(const Scalar& s)运算符的一个高级变量。Mat:reshape在无需复制数据的前提下改变2D矩阵的形状和通道数或其中之一。C+: Mat Mat:reshape(int cn, int rows=0) const参数:cn 新的通道数。若cn=0,那么通道数就保持不变。rows新的行数。 若rows = 0, 那么行数保持不变。该方法为*this元素创建新的矩阵头。这新的矩阵头尺寸和通道数或其中之一发生改变,在以下的情况任意组合都是有可能的: 新的矩阵没有新增或减少元素。通常,rows*cols*channels()在转换过程中保持一致。. 无数据的复制。也就是说,这是一个复杂度为 O(1)的操作。通常,如果该操作改变行数或透过其他方式改变元素行索引,那么矩阵必定是连续的。参见Mat:isContinuous()。例如,有一存储了STL向量的三维点集,你想用3xN的矩阵来完成下面的操作:std:vector vec;.Mat pointMat = Mat(vec). /把向量转化成Mat, 复杂度为O(1)的运算reshape(1). / 从Nx1的3通道矩阵得出Nx3 的单通道矩阵/同样是复杂度为O(1)的运算t(); / 最后转置Nx3 的矩阵/这个过程要复制所有的元素Mat:t转置矩阵。.C+: MatExpr Mat:t() const该方法通过矩阵表达式(matrix expression)实现矩阵的转置The method performs matrix transposition by means of matrix expressions. 它并未真正完成了转置但却返回一个临时的可以进一步用在更复杂的矩阵表达式中或赋给一个矩阵的转置矩阵对象:Mat A1 = A + Mat:eye(A.size(), A.type)*lambda;Mat C = A1.t()*A1; /计算(A + lambda*I)t * (A + lamda*I).Mat:inv反转矩阵C+: MatExpr Mat:inv(int method=DECOMP_LU) const参数:method 反转矩阵的方法。有以下几种可能的值: DECOMP_LU是 LU 分解一定不能是单数的。 DECOMP_CHOLESKY 是 Cholesky LLT只适用于对称正矩阵的分解。该类型在处理大的矩阵时的速度是LU的两倍左右。 DECOMP_SVD是 SVD 分解。如果矩阵是单数或甚至不是2维,函数就会计算伪反转矩阵。该方法执行矩阵的反转矩阵表达。这意味着该方法返回一个临时矩阵反转对象并可进一步用于更复杂的矩阵表达式的中或分配给一个矩阵。Mat:mul执行两个矩阵按元素相乘或这两个矩阵的除法。C+: MatExpr Mat:mul(InputArray m, double scale=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论