Другие языки программирования и технологии

Язык си. Рекурсивно транспонировать матрицу

Легко, вот так:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<unistd.h>
#define ROUND_UP(x, s) (((x)+((s)-1)) & -(s))
void transpose_scalar_block(int *A, int *B, int lda, int ldb, int block_size)
{ ​
​ ​ ​ for(int i=0; i<block_size; i++)
​ ​ ​ for(int j=0; j<block_size; j++)
​ ​ ​ B[j*ldb + i] = A[i*lda +j];​ ​
}
void transpose_block(int *A, int *B, int n, int m, int lda, int ldb, int block_size)
{
​ ​ ​ for(int i=0; i<n; i+=block_size)
​ ​ ​ for(int j=0; j<m; j+=block_size)
​ ​ ​ transpose_scalar_block(&A[i*lda +j], &B[j*ldb + i], lda, ldb, block_size);​ ​
}
int main()
{
int block_size=2;
const int n = 8;
const int m = 16;
int lda = ROUND_UP(m, block_size);
int ldb = ROUND_UP(n, block_size);
int *A = (int*)malloc(sizeof(int)*lda*ldb);
int *B = (int*)malloc(sizeof(int)*lda*ldb);
if(A && B)
{//if A && B
srand(time(NULL));​ ​ ​
for(int i=0;i<lda*ldb;i++)
{
​ ​ ​ *A++=rand()%10;
​ ​ ​ *B++=0;
}​ ​ ​
A-=lda*ldb;
B-=lda*ldb;
​ ​ ​ transpose_block(A, B, n, m, lda, ldb, block_size);
​ ​ ​ printf("\n\n Matrix A:\n");
​ ​ ​ ​ ​ ​
​ ​ ​ for(int i=0;i<ldb;i++)
​ ​ ​ {
​ ​ ​ for(int j=0;j<lda;j++)
​ ​ ​ printf("%d ",*A++);
​ ​ ​ printf("\n");
​ ​ ​ }
​ ​ ​ printf("\n\n Matrix B:\n");
​ ​ ​ for(int i=0;i<lda;i++)
​ ​ ​ {
​ ​ ​ for(int j=0;j<ldb;j++)
​ ​ ​ printf("%d ",*B++);
​ ​ ​ printf("\n");
​ ​ ​ }
A-=lda*ldb;
B-=lda*ldb;​ ​ ​
​ ​ ​
free(A);​ ​ ​ ​ ​ ​
free(B);
}//if A && B
fflush(stdout);
sleep(10);
return 0;​ ​ ​
}
Неизвестно Неизвестно
Неизвестно Неизвестно
37 945
Лучший ответ