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

文章目录

  • Matlab中im2col函数的实现(C语言)
      • 阅读之前注意:
    • im2col函数说明
    • im2col函数的C语言实现


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

你可能感兴趣的:(算法)