C++实现 多维转换(torch.Transpose、permute){Meta-SR}

这里要实现 Meta-SR 中的元放大部分中的多维操作,比如:torch.cat,torch.arange,torch.matmul,torch.Transpose,Tensor.view,Tensor.permute 等。

matmul 是多维矩阵乘法,和二维乘法差不多,只不过是多乘几次。

permute比较复杂,可以转化为多个二维交换 Transpose。其它的哪些就比较简单了。

定义多维张量:

#define MAX维度 6

class 张量
{
	bool new0;// 由new 创建的

	public:
	int		num;    //维数
	int   * value;  //各维大小
	float * data;   //连续数据


	//构造函数
	张量(int inum);
	张量(int inum,int inew0);
	~张量();
	int size();//总大小
	int size(int n);//某维大小

	bool 需用delete();//new
};

int 张量::size()
{
	if(this->value==NULL)
		return -1;
	int size=1;//总大小
	for(int i=0;inum;i++)
	{
		size *=this->value[i];
	}

	return size;
}

int 张量::size(int n)
{
	if(this->value==NULL)
		return -1;
	if(n>=this->num)
		return -1;
	return this->value[n];
}


张量::张量(int inum): num(inum)
{
	value=NULL;
	data=NULL;
	new0=false;
}

张量::张量(int inum,int inew): num(inum)//动态创建调用
{
	value=NULL;
	data=NULL;
	new0=true;
}

张量::~张量()
{
	if(value!=NULL)
		delete []value;  value=NULL;  
	if(data!=NULL)
		delete []data;  data=NULL;  
}

bool 张量::需用delete()
{
	if(new0)
		return true;
	else
		return false;
}

定义好就可以写一些函数了

维度交换 transpose:

 张量 *  transpose(张量 & si,int n0,int n1)
{
	张量 * di=new张量(si.num);
	
	if(si.value==NULL || si.data==NULL)
	{
		cout<<"出错了,transpose 输入无数据!"<value=new int[di->num];

		for(int i=0;ivalue[i]=si.value[i];
		}
		di->value[小]=si.value[大];
		di->value[大]=si.value[小];

		di->data=newfloat(si.size());

		float *s=si.data;
		float *d=di->data;

			float *d1,*d2;
			for(int i=0;idata+i*n大*n中*n小*n后;//跳过一块(后三维)

					d1=d;
					for(int i=0;i

写好各个函数就可以按 pytorch 代码写 C++ 了。

运行效果图:

输入图

Meta-SR重建1.3倍
2.0倍

C++实现 多维转换(torch.Transpose、permute){Meta-SR}_第1张图片3.5倍

C++实现 多维转换(torch.Transpose、permute){Meta-SR}_第2张图片4.0倍

下载:

win超分辩重建Meta-SR

超分辨率重建Meta-SR(1.1至9.9倍)的win32程序,由《Meta-SR-Pytorch-master》中的模型改编而来

https://download.csdn.net/download/juebai123/11977699

你可能感兴趣的:(超分辨率重建)