C++版的Transpose转换

        在Python端,我们可以直接使用transpose进行多维数组的变换,而C++没有相关的可以直接调用的函数,我们通过对顺序的更换来实现transpose操作。

        理论上来说,不同的维度对应着不用的顺序,将多维数组全部展开的话,是按照坐标顺序进行下标的计算,而想要转换的维度也是通过顺序进行变换,因此可以计算出原有的旧下标和新下标,可以获取到最新的变换后的数组信息。 

        下面的代码是针对一个四维数组进行变换的代码, 在CV领域内最常见的维度也就是四维向量了,计算不同变换的坐标以实现转换即可。 

vector<float> TransposeMatrix(vector<float>& x, vector<int> &m_n,int *pose)
{
	vector<float> x1(x.size());
	int m_n_n[8];
	for (int k = 0; k < 4; k++)
		m_n_n[k] = m_n[k];
	for (int k = 4; k < 8; k++)
		m_n_n[k] = 1;
	int i[4], s[4];
	for (i[0] = 0;  i[0] < m_n[pose[0]]; ++i[0])
		for (i[1] = 0; i[1] < m_n[pose[1]]; ++i[1])
			for (i[2] = 0; i[2] < m_n[pose[2]]; ++i[2])
				for (i[3] = 0; i[3] < m_n[pose[3]]; ++i[3])
				{
					//int old_index = i[0] * m_n[1] * m_n[2] * m_n[3] + i[2] * m_n[2] * m_n[3] + i[3] * m_n[3] + i[1];
					int old_index = 0;
					for (int j = 0; j < 4; j++)
					{
						s[j] = i[j];
						for (int k = 0; k < 3; k++)
							s[j] = s[j] * m_n_n[pose[j] + k + 1];
						old_index += s[j];
					}
					int new_index = 0;
					for (int j = 0; j < 4; j++)
					{
						s[j] = i[j];
						for (int k = j+1; k < 4; k++)
							s[j] = s[j] * m_n_n[pose[k]];
						new_index += s[j];
					}
					x1[new_index] = x[old_index];
				}
	return x1;
}

            int t[4] = { 0, 3, 2 ,1 };
            weight = TransposeMatrix(weight_1, m_n, t);

同时附带一下使用的几个函数,二维矩阵的reshape

vector<vector<float>> matrixReshape(vector<vector<float>>& mat, int r, int c)
{
	int m = mat.size();
	int n = mat[0].size();
	if (m * n != r * c) {
		return mat;
	}
	vector<vector<float>> mat2(r, vector<float>(c, 0));
	for (int k = 0; k < m * n; k++) 
		mat2[k / c][k % c] = mat[k / n][k % n];
	return mat2;
}

二维vector的转置,即A.T

vector<vector<float>> transMatrix(vector<vector<float>>& x)
{
	int m = x.size();
	int n = x[0].size();
    vector<vector<float>> x1(n, vector<float>(m, 0));
    for (int i = 0; i < m; i++) // 从行开始,逐行检索
	  for (int j = 0; j < n; j++) // 对该行每一列的元素检索
		// 将对应位置的两个元素交换位置
		 x1[j][i] = x[i][j];
	return x1;
}

一维数组转换为二维数组

vector<vector<float>> one_dim_matrixReshape(vector<float>& W, int m, int n)
{
	vector<vector<float>> x(m, vector<float>(n, 0));
	int t = W.size();
	for (int k = 0; k < t; k++)
		x[k / n][k % n] = W[k % t];
	return x;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值