函数功能
交换数组中的两个维度(轴)。
用的方法是最笨的循环赋值。
二维矩阵转置
样例
二维矩阵转置:mySwapaxes_2D_float(inArr,2,2);
参数说明
- inArr:输入三维矩阵(数组名)
- x, y:二维矩阵各维度长度[x][y]
代码
void mySwapaxes_2D_float(float* inArr, int x, int y) {
float* outArr = NULL;
if (inArr == NULL) {
printf("mySwapaxes_2D:\ninArr == NULL\n");
return;
}
outArr = (int*)malloc(sizeof(int) * x * y);
if (outArr == NULL)
return;
for (int i = 0;i < x; i++) {
for (int j = 0; j < y; j++) {
outArr[getIndexOfArr_2d(y, x, j, i)] = inArr[getIndexOfArr_2d(x, y, i, j)];
}
}
memcpy(inArr,outArr, sizeof(float)*x*y);
free(outArr);
return;
}
三维矩阵转置
样例
三维矩阵第2,3轴转置:mySwapaxes_3D_float(inArr,2,2,3,1,2);
参数说明
- inArr:输入三维矩阵(数组名)
- x, y, z:三维矩阵各维度长度[x][y][z]
- cg1,cg2:待转置的目标轴索引
代码
void mySwapaxes_3D_float(float* inArr, int x, int y, int z, int cg1, int cg2) {
//三维数组转置其中两轴
float* outArr = NULL;
int maxSize = 0;
if (cg1<0 || cg1 > 2 || cg2 < 0 || cg2 > 2)
return;
if (cg1 == cg2) {
printf("mySwapaxes_3D_float:\ncg1 = cg2\n");
return;
}
maxSize = sizeof(float) * x * y * z;
outArr = (float*)malloc(maxSize);
if (outArr == NULL) {
return;
}
memset(outArr, 0, maxSize);
if (cg1 == 0) {
if (cg2 == 1) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
for (int k = 0; k < z; k++) {
outArr[getIndexOfArr_3d(y, x, z, j, i, k)] = inArr[getIndexOfArr_3d(x, y, z, i, j, k)];//基准
}
}
}
}
else if (cg2 == 2) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
for (int k = 0; k < z; k++) {
outArr[getIndexOfArr_3d(z, y, x, k, j, i)] = inArr[getIndexOfArr_3d(x, y, z, i, j, k)];
}
}
}
}
}
else if (cg1 == 1) {
if (cg2 == 0) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
for (int k = 0; k < z; k++) {
outArr[getIndexOfArr_3d(y, x, z, j, i, k)] = inArr[getIndexOfArr_3d(x, y, z, i, j, k)];
}
}
}
}
else if (cg2 == 2) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
for (int k = 0; k < z; k++) {
outArr[getIndexOfArr_3d(x, z, y, i, k, j)] = inArr[getIndexOfArr_3d(x, y, z, i, j, k)];
}
}
}
}
}
else if (cg1 == 2) {
if (cg2 == 0) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
for (int k = 0; k < z; k++) {
outArr[getIndexOfArr_3d(y, x, z, j, i, k)] = inArr[getIndexOfArr_3d(x, y, z, i, j, k)];
}
}
}
}
else if (cg2 == 1) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
for (int k = 0; k < z; k++) {
outArr[getIndexOfArr_3d(x, z, y, i, k, j)] = inArr[getIndexOfArr_3d(x, y, z, i, j, k)];
}
}
}
}
}
else;
memcpy(inArr, outArr,maxSize);
free(outArr);
}
四维矩阵转置
样例
四维矩阵第2,3轴转置:mySwapaxes_4D_float(inArr,2,2,3,2,1,2);
参数说明
- inArr:输入四维矩阵(数组名)
- idx,idx1, idx2, idx3:四维矩阵各维度长度[idx][idx1][idx2][idx3]
- cg1,cg2:待转置的目标轴索引
代码
void mySwapaxes_4D_float(float* inArr, int idx, int idx1, int idx2, int idx3, int cg1, int cg2) {
/*
4维数组转置其中两轴
inArr:输入四维矩阵(数组名)
idx,idx1,idx2,idx3:四维矩阵各维度长度[idx][idx1][idx2][idx3]
cg1,cg2:待转置的目标轴索引
*/
float* outArr = NULL;
int maxSize = sizeof(float) * idx * idx1 * idx2 * idx3;
if (inArr == NULL) {
printf("mySwapaxes_4D_float:\inArr == NULL\n");
return;
}
if (cg1 < 0 || cg1>3 || cg2 < 0 || cg2>3) {
printf("mySwapaxes_4D_float:\ncg1 < 0 || cg1>3 || cg2 < 0 || cg2>3\n");
return;
}
if (cg1 == cg2) {
printf("mySwapaxes_4D_float:\ncg1 = cg2\n");
return;
}
outArr = (float*)malloc(maxSize);
if (outArr == NULL) {
printf("mySwapaxes_4D_float:\nmalloc error\n");
return;
}
memset(outArr,0, maxSize);
//计算
if (cg1 == 0) {
if (cg2 == 1) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx1, idx, idx2, idx3, j, i, k, l)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[j][i][k][l] = inArr[i][j][k][l];
}
else if (cg2 == 2) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx2, idx1, idx, idx3, k, j, i, l)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[k][j][i][l] = inArr[i][j][k][l];
}
else if (cg2 == 3) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx3, idx1, idx2, idx, l, j, k, i)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[l][j][k][i] = inArr[i][j][k][l];
}
}
//------------------------------------------------------------------------
else if (cg1 == 1) {
if (cg2 == 0) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx1, idx, idx2, idx3, j, i, k, l)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[j][i][k][l] = inArr[i][j][k][l];
}
else if (cg2 == 2) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx, idx2, idx1, idx3, i, k, j, l)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[i][k][j][l] = inArr[i][j][k][l];
}
else if (cg2 == 3) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx, idx3, idx2, idx1, i, l, k, j)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[i][l][k][j] = inArr[i][j][k][l];
}
}
//------------------------------------------------------------------------------
else if (cg1 == 2) {
if (cg2 == 0) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx2, idx1, idx, idx3, k, j, i, l)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[k][j][i][l] = inArr[i][j][k][l];
}
else if (cg2 == 1) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx, idx2, idx1, idx3, i, k, j, l)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[i][k][j][l] = inArr[i][j][k][l];
}
else if (cg2 == 3) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx, idx1, idx3, idx2, i, j, l, k)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[i][j][l][k] = inArr[i][j][k][l];
}
}
//--------------------------------------------------------------------------------
else if (cg1 == 3) {
if (cg2 == 0) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx3, idx1, idx2, idx, l, j, k, i)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[l][j][k][i] = inArr[i][j][k][l];
}
else if (cg2 == 1) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx, idx3, idx2, idx1, i, l, k, j)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[i][l][k][j] = inArr[i][j][k][l];
}
else if (cg2 == 2) {
for (int i = 0; i < idx; i++)
for (int j = 0; j < idx1; j++)
for (int k = 0; k < idx2; k++)
for (int l = 0; l < idx3; l++)
outArr[getIndexOfArr_4d(idx, idx1, idx3, idx2, i, j, l, k)] = inArr[getIndexOfArr_4d(idx, idx1, idx2, idx3, i, j, k, l)];
//outArr[i][j][l][k] = inArr[i][j][k][l];
}
}
memcpy(inArr,outArr,maxSize);
free(outArr);
}