블록 행렬 곱셈을 재귀 적으로 구현하려고합니다. 그것은 2 × 2의 행렬을 위해 잘 작동되지만, 4 × 4와 같은 크기로 증가하고 답변 루프 3의재귀 블록 행렬 곱셈
결과 크게 다를 재귀
1.53 0.89 0.53 1.33
1.75 1.09 0.72 1.17
1.78 1.43 0.57 1.69
1.73 1.04 0.62 1.51
결과
1.34 1.49 0.30 1.45
2.02 1.93 0.79 1.30
2.70 2.75 0.87 2.21
1.81 1.84 0.59 1.47
만약 블록의 양 행렬 내에서 4보다 큰 경우 블록을 4 개의 큰 블록으로 나누고 제곱근을 가져 와서 새로운 차원을 얻은 다음 8 개의 재귀 호출을 만듭니다.
void myRecMat(float** MatrixA, float** MatrixB, float** MatrixC, int srA, int scA, int srB, int scB, int srC, int scC, int blocks,int dim){
if(blocks > 4)
{ blocks=blocks/4;
int newDim = dim/2;
myRecMat(MatrixA,MatrixB,MatrixC, srA,scA,srB,scB,srC,scC,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA,scA+newDim,srB+newDim,scB,srC,scC,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA,scA,srB,scB+newDim,srC,scC+newDim,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA,scA+newDim,srB+newDim,scB,srC+newDim,scC,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA+newDim,scA,srB,scB,srC+newDim,scC,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA+newDim,scA+newDim,srB+newDim,scB,srC+newDim,scC,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA+newDim,scA+newDim,srB,scB+newDim,srC+newDim,scC+newDim,blocks,newDim);
myRecMat(MatrixA,MatrixB,MatrixC, srA+newDim,scA+newDim,srB+newDim,scB+newDim,srC+newDim,scC+newDim,blocks,newDim); }
else
{
int i,j,k,endR,endC;
endR=srC+dim;
endC=scC+dim;
for(i=srC; i< endR; i++)
for(j=scC;j< endC;j++)
for(k=0; k<newDim; k++)
c[i][j] += a[i][k]*b[k][j];
}
}
sr과 sc는 행과 열을 시작하는 데 사용됩니다. 간격은 맞아야합니다. 그래서 저는 솔직히 여기서 리드를 벗어납니다. 고맙습니다.
함수 선언 – banarun
추가 선언을 추가하십시오. – user2243369