정사각형 매트릭스의 내부 캐시 - 무시 무시한 전치에 대한 위키 문서에 설명 된 접근 방식을 구현하고 있습니다.매트릭스 분할 및 정복
https://en.wikipedia.org/wiki/In-place_matrix_transposition
알고리즘은 기본적으로 순환 후, 4 개로 분할 매트릭스 대각선을 따라있는 사분면 이항 이상과 이하 것들을 스왑. 실제 전치/교체는 행렬의 크기가 2 * 2 이하인 경우에만 발생합니다. 그렇지 않으면 다시 분할됩니다.
나는 세 가지 기능으로 분할 한:
이 주어진 크기 N의 절차를 시작한다 :
void SmartTranspose(int A[row][col]) {
Transpose(A, 0, 0, N, N);
}
다음 :
void Transpose(int A[row][col], int x, int y, int w, int h) {
int Temp;
if ((w - x) * (h - y) <= 4){
for (int row1 = x ; row1 < w -1 ; row1++)
for (int col1 = y + 1 ; col1 < h ; col1++) {
Temp = A[row1][col1];
printf("transp: %d %d\n", A[row1][col1], A[col1] [row1]);
A[row1][col1] = A[col1][row1];
A[col1][row1] = Temp;
}
}
else {
int halfh = h/2;
int halfw = w/2;
Transpose(A, x, y, halfw , halfh);
Transpose(A, x + halfw, y + halfh, w , h);
TransposeSwap(A, x + halfw, y, w, halfh, x, y + halfh, halfw , h);
}
}
그리고 마지막으로 :
void TransposeSwap(int A[row][col], int x, int y, int w, int h,int x1, int y1, int w1, int h1) {
int Temp; int row2 = x1; int col2 = y1;
if ((w - x) * (h - y) <= 4 && (w1 - x1) * (h1 - y1) <= 4) {
for(row1 = x; row1 < w; row1++)
for(col1 = y; col1 < h; col1++)
{
Temp = A[row1][col1] ;
A[row1][col1] = A[col1][row1];
A[col1][row1] = Temp;
}
}
else {
printf("RECURSE");
int halfh = h/2;
int halfw = w/2;
int halfh1 = h1/2;
int halfw1 = w1/2;
TransposeSwap(A, x, y, halfw, halfh, x1, y1, halfw1, halfh1);
TransposeSwap(A, x + halfw, y, w, h - halfh, x1, y1 + halfh1, halfw1, h1);
TransposeSwap(A, x , y + halfh, halfw, h, x1 + halfw1, y1, w1, halfh1);
TransposeSwap(A, x + halfw, y + halfh, w, h, x1 + halfw1, y1 + halfh1, w1, h1);
}
}
그러나, 나는 나의 논리가 어디서 잘못되었는지 보려고 고심하고있다.
편집 : 출력
Original matrix:
1948037971 40713922 986050715 74181839 943010147 1060710730
18590233 268906808 1966315840 1325423973 398061279 2047858287
513589654 1727398080 2016821685 277200601 1611383116 2000671901
228038281 1863845528 106517081 1934721636 745170263 1736525254
224427632 687572994 1249224754 1497415191 537022734 1443375385
1054092341 337577057 1484089307 2040143056 411758897 279615807
Transposed matrix:
1948037971 18590233 513589654 74181839 943010147 1060710730
40713922 268906808 1727398080 1325423973 398061279 2047858287
986050715 1966315840 2016821685 277200601 1611383116 2000671901
228038281 1863845528 106517081 1934721636 745170263 1736525254
224427632 687572994 1249224754 1497415191 537022734 1443375385
1054092341 337577057 1484089307 2040143056 411758897 279615807
의 예는 정확한 출력은 전치 행렬이어야한다.
편집 : 주요 기능 및 선언 :
int row = 40000 , col = 40000;
static int A[40000][40000];
static int N[100] = {0};
void SmartTranspose(int A[row][col]);
void Transpose(int A[row][col], int x, int y, int w, int h);
void InitializeMatrix(int X[row][col]);
void PrintMatrix(int X[row][col]);
double pow(double x, double y);
int matrix = 0;
void TransposeSwap(int A[row][col], int x, int y, int w, int h,int x1, int y1, int w1, int h1);
int main(){
srand(time(NULL));
double sizes = 0;
int count = 0;
for(sizes = 20; sizes < 30; sizes++)
{
N[count] = floor(pow(2, (sizes/9)));
printf("N %d\n", N[count]);
count++; }
for (matrix = 0; matrix <= count -1 ; matrix++){
InitializeMatrix(A);
printf("N %d\n",N[matrix]);
printf("\nOriginal matrix: \n");
SmartTranspose(A);
printf("E\n");
printf("\nTransposed matrix: \n");
PrintMatrix(A);
}
return 0;
}
전체 코드에 대한 링크 : https://jpst.it/QaBq
얻을 수있는 결과물의 예를 제공 할 수 있습니까? – saeleko
예를 들어 걱정하지 않아도됩니다. 'halfh = h/2;''h '가 짝수일까요? –
저는 반쪽이 바닥으로 덮일 것이라고 가정합니다. 따라서 h = 5, 반 = 2이면 다른 '반'은 2에서 5가 될 것입니다. 문제가 있습니까? – MHH