Matlab中im2col函数的实现(C语言)

Matlab中im2col函数的实现(C语言)

  • im2col函数说明
  • im2col函数的C语言实现

阅读之前注意:

本文阅读建议用时:27min
本文阅读结构如下表:

项目下属项目测试用例数量
im2col函数说明0
im2col函数的C语言实现1

im2col函数说明

  1. 请查阅matlab的帮助文档

im2col函数的C语言实现

Matlab的矩阵运算真是十分强大,竟然还有像eig这种计算特征向量的函数。
最近学习一种图像恢复算法,接触到了im2col函数,这个函数的作用规则非常有规律,所以我在这里实现了C语言的版本。
原参考语句:X=im2col(I,[b_size b_size],’distinct’);
其中 I 是图像的矩阵,b_size是模板的维度大小,’distinct’是im2col函数的参数设置。
程序参考以下代码:

float **im2col(int *N, int *num, const float **I, int row, int col, int b_size)
{
    int i = 0, j = 0;
    int moban_size = b_size * b_size;

    int row_addtion = (row%b_size > 0 ? 1 : 0);
    int col_addtion = (col%b_size > 0 ? 1 : 0);
    int row_part = row / b_size + row_addtion;//行数能被分为模块的数目
    int col_part = col / b_size + col_addtion;//列数能被分为模块的数目
    int row2 = moban_size;
    int col2 = row_part*col_part;
    *N = row2;
    *num = col2;

    float **X = (float **)malloc(row2*sizeof(float *));
    for (i = 0; i < row2; i++)
        X[i] = (float *)malloc(col2*sizeof(float));
    int targetRow = 0;
    int targetCol = 0;
    for (i = 0; i < row2; i++)
    {
        for (j = 0; j < col2; j++)
        {
            targetRow = j%row_part*b_size + i%b_size;//按照规则计算目标所在行
            targetCol = j / row_part*b_size + i / b_size;//计算目标所在列
            if (targetRow >= row || targetCol >= col)//如果目标不存在
                X[i][j] = 0;
            else
                X[i][j] = I[targetRow][targetCol];//获取目标
        }
    }
    printf("im2col后的矩阵:\n");
    for (i = 0; i < row2; i++)//输出测试
    {
        for (j = 0; j < col2; j++)
        {
            printf("%-4.0f ", X[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    return X;
}

本段代码仅作个人存档1

  1. 来源于一种图像恢复算法中的应用.
点赞