在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;
}