2010-03-01 5 views
1

Matlab에서 방정식을 파생하고 단순화하여이를 C++ 프로그램에서 사용하려고합니다. Matlab은 힘을 사용하는 것을 좋아하지만, ^ 부호가 있지만 C++은 그것을 1 비트 좋아하지 않습니다. Matlab에 방정식을 다시 써서 C++ 친화적 방정식을 출력하도록하려면 어떻게해야합니까?C++에서 사용하기 위해 matlab에서 방정식을 다시 작성하는 방법

답변

2

방정식이 너무 길어서 손으로 직접 가고 싶지 않다면 방정식을 다시 포맷하여 C++과 친숙하게 만들 수있는 방법 중 하나는 방정식에 대한 MATLAB 코드의 텍스트를 구문 분석하는 것입니다 MATLAB의 REGEXPREP 함수. 당신은 당신의 MATLAB 식의 코드를 가지고 eqStr 변수 첫번째 문자열에 넣어해야

eqStr = 'the text of your equation code'; %# Put your equation in a string 
expr = '(\w+)\.?\^(\d+)';     %# The pattern to match 
repStr = 'pow($1,$2)';      %# The replacement string 
newStr = regexprep(eqStr,expr,repStr);  %# The new equation string 

: 여기 pow(x,2) 또는 pow(y,3)와 형태 x^2 또는 y.^3의 표현을 대체 할 수있는 방법의 예입니다. 그러면 REGEXPREP의 출력이 새로운 C++ 친화적 인 수식 newStr의 텍스트가됩니다.

x*x 또는 y*y*y의 결과를 얻으려면 dynamic operators을 사용하여 교체 문자열을 변경할 수도 있습니다. 예를 들어 :

eqStr = 'the text of your equation code'; %# Put your equation in a string 
expr = '(\w+)\.?\^(\d+)';     %# The pattern to match 
repStr = '${repmat([$1,''*''],1,$2-''0''-1)}$1'; %# The replacement string 
newStr = regexprep(eqStr,expr,repStr);   %# The new equation string 
+0

완벽! 이것이 내가 바라는 바로 그 것이다. 솔직히 말해서, 나는 matlab에이 기능을 사용하기 쉽게 직접 구현 한 것이 없다는 사실에 조금 놀랐다. 많은 사람들이 나와 함께 작업을 유도하고 MATLAB에서 방정식을 단순화 한 다음 C++ 프로그램에 구현합니다 (대부분 대수 MATLAB 방정식을 수정하지 않고 코드에 붙여 넣을 수는 있지만 대부분이 경우에는 그렇지 않습니다) . 고마워요, 당신은 저에게 수 시간의 작업을 저장했습니다! – 17mm

+0

@ 17mm : 기꺼이 도와주세요. 단 하나의 머리 위로 ... 위의 예제는'(x + y)^2'와 일치하지 않을 것입니다. 그들은 단일 변수를 하나의 힘과 일치시킬 것입니다. 다른 경우에도 작동하도록 일치 식을 수정해야하므로 더 복잡해질 수 있습니다. – gnovice

+0

@niels : 편집이 아마도 독립 실행 형 답변으로 제공되기 때문에 거부되었습니다. 위에서 제시 한 해결책에 대한 별도의 접근 방법이며 사용자에게 별도로 투표 할 기회를 제공하는 것이 좋습니다. – gnovice

1

pow 제품군을 사용할 수 있습니다.

+0

글쎄, 내 모든 힘은 2 또는 3의 정수에 달한다. pow() 함수는 비싸고 계산이 많이 필요합니다. 방정식 자체는 매우 길기 때문에 수동으로 들어가서 정리하지 않으려 고합니다. – 17mm

+0

그러면 자동으로 Matlab 코드를 파싱하고 C 코드 (예 : x * x 또는 y * y * y)를 출력 하시겠습니까? –

+0

예, 정확히 무엇을 찾고 있어요 – 17mm

1
pow() 기능이 정수 능력에 대한 과부하 C++에서

-이 빠른 알고리즘을 사용하기위한^2,3 등

matlab에 같은 구문 (나는 방법을 모르는를 사용하는 matlab에 복제 Octave 있습니다
+0

방금 ​​몇 초 전에 테스트했습니다. 정수로만 오버로드 된 버전을 사용했는데 단순히 x * x를 사용하면 정수 pow() 함수보다 20 배 빠릅니다. 방정식은 문자 그대로 전체 8.5x11 용지입니다. 나는 손으로 그것을하고 있기 때문에 그들의 고양이가 whout 그것을 다시 작성 MATLAB 명령을 빨아 줄 알고 싶어요. – 17mm

+0

함수 호출에서 작은 오버 헤드가있을 수 있습니다. 두 번째 인수가 'int'로 선언 되었습니까? 값 2로 double을 전달하면 충분하지 않습니까? 릴리스 빌드를 사용하고 있습니까? –

+0

아니요, 단순히 디버그 모드로 실행되는 타이머를 사용하고 있습니다. matlab에 일부 C++ 친숙한 코드를 출력 할 수있는 방법이 없습니까? – 17mm

0

구문의 많은 부분이 지원됩니다). 오픈 소스이기 때문에 아마도 파서를 재사용 할 수 있습니다. (필자는 "조금 오래되었습니다"thread에서 저자에 대해 뭔가를 읽었습니다).

그런 다음 구문 트리에서 C++ 코드를 만들 수 있습니다.

그리고 Matlab을 C 코드로 변환하기위한 tool도 있습니다. 나는 그것을 아직 사용하지 않았으며 무료로 사용할 수 없습니다.

+1

해당 도구에 대한 DDJ 기사도 있습니다 : http://www.drdobbs.com/cpp/196901296. –

1

접근 방법은 C 코드에 상징적 인 표현을 변환 CCODE의 MATLAB 함수를 사용하는 것입니다. 예를 들어 ccode(sym('(x+y)^2'))t0 = pow(x+y,2.0);을 반환합니다. 물론 C++ 프로그램에서 using namespace std을 잊어 버리거나 (powstd::pow으로 바꾸십시오) 그렇지 않으면 컴파일되지 않습니다. ccode에 대한 자세한 내용은 MATLAB 도움말을 참조하십시오.

관련 문제