2013-12-11 2 views
1

mex 파일로 컴파일 된 후에 cpp 형식의 행렬 곱셈을 수행하려면 어떻게해야합니까?Matlab 용 cpp 파일의 행렬 곱

pfMatrix, wcMatrix
cMatrix = (1/r) * pfMatrix * wcMatrix; %here pfMatrix is 2x3 and wcMatrix is 3x8 
% Hence cMatrix is 2x8 
% r is a scalar 

및 R은 cpp 파일에 올바르게 선언하고 스크립트에서와 동일한 값을 가질 : 매트랩 스크립트

내 일반 행렬 곱셈은 다음과 같다. 그러나 cMatrix는 나에게 같은 결과를주지 않습니다. 여기에 cpp의 행렬 곱셈의 구현 :

int i, n, j; 
    for (i = 0; i<1; i++) 
    { 
     for (n = 0; n<7; n++) 
     { 
      for (j = 0; j<2; j++) 
      { 
       d->cMatrix[i][n] += (d->pfMatrix[i][j]) * (d->wcMatrix[j][n]); 
      } 
      d->cMatrix[i][n] = (1/d->r) * d->cMatrix[i][n]; 
     } 
    } 

편집 :

내가 Ben Voigt 대답 다음 루프를 수정했습니다. cMatrix의 결과는 여전히 Matlab 스크립트에서 계산 된 것과 동일하지 않습니다. 예를 들어

이 경우

pfMatrix = [7937.91049469652,0,512;0,7933.81033431703,384]; 
wcMatrix = [-0.880633810389421,-1.04063381038942,-1.04063381038942,-0.880633810389421,-0.815633810389421,-1.10563381038942,-1.10563381038942,-0.815633810389421;-0.125,-0.125,0.125,0.125,-0.29,-0.29,0.29,0.29;100,100,100,100,100,100,100,100]; 
r = 100; 

, cMatrix(1,1)있다 : 그러나

(pfMatrix(1,1)*wcMatrix(1,1) + pfMatrix(1,2)*wcMatrix(2,1) + pfMatrix(1,3)*wcMatrix(3,1))/r = 442.09 

등가 결과 959mex 파일.

편집 # 2 :

나는 (2 부문 누락)가 제대로 선언되지 않은 pfMatrix의 요소에서 오류를 발견했습니다. 따라서 Ben Voigt의 대답이 올바르게 작동하고 있습니다. 그러나 두 결과 간에는 여전히 약간의 차이가 있습니다 (Matlab 스크립트는 442를, mex는 447을 제공합니다. 다른 데이터 유형의 결과 일 수 있습니까?).

수정 # 3 :

오류를 발견하고이 행렬 곱셈 루프와 관련되지 않았다.

+0

나는이 모든 것이 [적절한'mex' 파일]에 있다고 가정한다. (http://www.mathworks.com/help/matlab/matlab_external/using-mex-files-to-call-cc-and- fortran-programs.html)? – horchler

+0

@horchler 실제로 mex 파일은 오류없이 생성됩니다. 오류없이 호출 할 수 있습니다. 유일한 문제는 출력'cMatrix'가 올바르지 않다는 것입니다. –

+1

추가하기 전에'cMatrix'의 모든 요소를 ​​0으로 설정 했습니까? –

답변

2

결과 행렬을 스크래치 공간으로 사용하는 것은 좋은 생각이 아닙니다. 컴파일러는 앨리어싱을 걱정해야하는데, 이는 최적화 할 수 없다는 것을 의미합니다.

은 0으로도 편리한 장소를 제공하는 명시 적 작업 변수를보십시오 :

for (int i = 0; i < 2; ++i) { 
    for (int n = 0; n < 8; ++n) { 
     double accum = 0.0; 
     for (int j = 0; j < 3; ++j) { 
      accum += (d->pfMatrix[i][j]) * (d->wcMatrix[j][n]); 
     } 
     d->cMatrix[i][n] = accum/d->r; 
    } 
} 

귀하의 범위는 내가 해결 한 이는 또한 잘못이었다.

(또한 그러나 그것은이 크기의 제품에 문제가되지해야한다, 큰 행렬에 좋은 성능이 좋은 캐시 동작을 취득 밴딩 필요 있습니다.)

0

는 매트릭스 사이의 곱셈이 방법으로해야합니다 A [m] [n] * B [n] [p] = R [m] [p].

for 루프에서 작성한 조건이 올바르지 않으며 행렬 차원을 고려하지 않습니다.

오픈 소스 인 Eigen 라이브러리를 살펴보고 매트릭스 곱셈을 수행하는 간단한 방법을 제공하십시오.

+0

그는 m, n, p 대신에 i, j, n을 사용하지만 곱셈이 좋게 보인다. –

+0

게시물을 수정하기 전에 답변을 시작했습니다. – TommasoF

+0

오 코멘트가 아니라 코드를보고있었습니다. MATLAB 버전이 작동하는 경우 치수가 호환되어야한다고 생각했습니다. –