C语言 2维~4维矩阵转置(两轴交换,swapaxes)

393 阅读3分钟

函数功能

交换数组中的两个维度(轴)。

用的方法是最笨的循环赋值。

二维矩阵转置

样例

二维矩阵转置:mySwapaxes_2D_float(inArr,2,2);

image.png

参数说明

  • 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);

image.png

参数说明

  • 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);

image.png

参数说明

  • 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);

}