mat2cell函数解析

在提取人脸的lbp特征时,看到mat2cell这个函数,在查阅了一些资料后在此记录一下。


1、什么是元胞数组

Cell Array也称为元胞数组,是matlab存储数据的一种特有的存储数据的类型。 使用形式就是:比如先定义了一个字符型的变量a,并赋值,然后定义一个长整型b,并赋值…最后用大括号来打包裹c={a,b}来形成元胞c,当然进一步可以将c再包裹进去如d={a,b,c,'abc',123}都是合法的。

2、函数的功能

C = MAT2CELL(X,M,N) breaks up the 2-D array X into a cell array of
adjacent submatrices of X. X is an array of size [ROW COL], M is the
vector of row sizes (must sum to ROW) and N is the vector of column
sizes (must sum to COL). The elements of M and N determine the size of
each cell in C by satisfying the following formula for I = 1:LENGTH(M)
and J = 1:LENGTH(N),

  • 该函数主要是将一个2维矩阵分解成几个相邻(adjacent)的子矩阵。比如: C = MAT2CELL(X,M,N),其中X就是待分解的矩阵,M是行数,N是列数,各子矩阵行数相加等于X的行数,列数也一样。

  • 举例:
    X = [1 2 3 4; 5 6 7 8; 9 10 11 12];
    C = mat2cell(X,[1 2],[1 3])
    其结果:
    C =

2×2 cell 数组

{[       1]}    {1×3 double}
{2×1 double}    {2×3 double}

3、LBP算法里的mat2cell

这就要说到该算法的原理了
将整个人脸划分为4*4的小区域(cell);(此处该函数起作用了),后面会对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Qt中使用matio库读取mat文件,需要先安装matio库。可通过以下命令在Ubuntu系统中安装: ``` sudo apt-get install libmatio-dev ``` 安装完成后,在Qt的.pro文件中添加以下内容: ``` LIBS += -lmatio ``` 然后可以通过以下代码读取mat文件中的info变量: ```cpp #include <matio.h> // 打开mat文件 mat_t *matfp = Mat_Open("example.mat", MAT_ACC_RDONLY); if (matfp == NULL) { qWarning() << "Failed to open mat file."; return; } // 获取info变量 matvar_t *infoVar = Mat_VarRead(matfp, "info"); if (infoVar == NULL) { qWarning() << "Failed to read info variable."; Mat_Close(matfp); return; } // 解析info变量 if (infoVar->class_type == MAT_C_STRUCT) { // 获取结构体成员数量 int nFields = Mat_VarGetNumberOfFields(infoVar); for (int i = 0; i < nFields; i++) { // 获取结构体成员 matvar_t *fieldVar = Mat_VarGetStructField(infoVar, "field_name", MAT_BY_NAME, i); if (fieldVar != NULL) { // 解析变量 if (fieldVar->class_type == MAT_C_CHAR) { // 字符串类型 QString str = QString::fromUtf8((const char *)fieldVar->data); qDebug() << "String field value:" << str; } else if (fieldVar->class_type == MAT_C_CELL) { // Map类型 int nCells = Mat_VarGetNumberOfCells(fieldVar); for (int j = 0; j < nCells; j++) { matvar_t *cellVar = Mat_VarGetCell(fieldVar, j); if (cellVar != NULL) { // 解析Map元素 matvar_t *keyVar = Mat_VarGetStructField(cellVar, "key", MAT_BY_NAME, 0); matvar_t *valueVar = Mat_VarGetStructField(cellVar, "value", MAT_BY_NAME, 0); if (keyVar != NULL && valueVar != NULL) { QString key = QString::fromUtf8((const char *)keyVar->data); QString value = QString::fromUtf8((const char *)valueVar->data); qDebug() << "Map field value:" << key << value; } Mat_VarFree(cellVar); } } } Mat_VarFree(fieldVar); } } } // 释放变量和mat文件 Mat_VarFree(infoVar); Mat_Close(matfp); ``` 其中,通过Mat_VarRead函数获取变量;通过Mat_VarGetStructField获取结构体成员;通过Mat_VarGetNumberOfCells和Mat_VarGetCell获取Map元素。在解析字符串类型和Map类型时,需要根据变量的class_type进行判断。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值