2010-05-11 5 views
6

mex 함수에서 matlab 구조체의 필드에 저장된 행렬에 액세스하는 방법을 알아 내려고합니다. 굉장히 긴 호흡 것mex 함수에서 matlab 구조체 필드의 행렬에 액세스하는 방법?

... 설명해 드리죠 :

을 나는 다음과 같이 정의 된 MATLAB 구조체가 : 내가 싶습니다있는 MEX 기능이

matrixStruct = struct('matrix', {4, 4, 4; 5, 5, 5; 6, 6 ,6}) 

을 매트릭스 (매트릭스 [0] [0], C 용어로)의 첫 번째 요소에 대한 포인터를받을 수 있지만 그 방법을 이해할 수 없었습니다.

나는 시도 다음

/* Pointer to the first element in the matrix (supposedly)... */ 
double *ptr = mxGetPr(mxGetField(prhs[0], 0, "matrix"); 

/* Incrementing the pointer to access all values in the matrix */ 
for(i = 0; i < 3; i++){ 
    printf("%f\n", *(ptr + (i * 3))); 
    printf("%f\n", *(ptr + 1 + (i * 3))); 
    printf("%f\n", *(ptr + 2 + (i * 3))); 
} 

무엇이 인쇄를 종료하면 다음과 같다 : 아마도 그것은으로 남았습니다 일이라고 생각하고, 다음의

4.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 

나는 또한 시도 변동 중첩 된 함수 호출은 사용할 수 있지만 아무런 소용이 없습니다.

/* Pointer to the first location of the mxArray */ 
mxArray *fieldValuePtr = mxGetField(prhs[0], 0, "matrix"); 

/* Get the double pointer to the first location in the matrix */ 
double *ptr = mxGetPr(fieldValuePtr); 

/* Same for loop code here as written above */ 

ID가없는 사람 내가 어떻게하려고하는지, 또는 내가 잠재적으로 잘못하고있는 것을 어떻게 달성 할 수 있는지에 관해서는?

감사합니다.

편집 : yuk의 의견에 따르면, 나는 1 차원 배열의 double 형인 array라는 필드를 가진 구조체에서 비슷한 연산을 시도했다.

다음과 같이 어레이를 포함하는 구조체가 정의된다

arrayStruct = struct('array', {4.44, 5.55, 6.66}) 

제가 상기 MEX 함수 내에서 arrayStruct에 다음 시도 :

mptr = mxGetPr(mxGetField(prhs[0], 0, "array")); 

printf("%f\n", *(mptr)); 
printf("%f\n", *(mptr + 1)); 
printf("%f\n", *(mptr + 2)); 

하지만 출력 무엇 이어 이전에 인쇄 된 :

4.440000 
0.000000 
0.000000 
+0

나는 mex 파일에 대한 많은 경험이 없으며 단지 약간의 생각 만하고있다. MATLAB의 셀 배열 인 변수에 액세스하려고합니다. 결과적으로 데이터가 저장되었는지 확신합니까? 구조체에 double 배열을 넣으면 어떻게됩니까? 'matrixStruct = struct ('matrix', [4, 4, 4; 5, 5, 5; 6,6,6])' – yuk

+0

yuk - 내가 내 질문에 첨부 한 것이 무엇인지 알려주기 바란다. 해야 할 것. –

+0

아니요, 여전히 셀 배열을 정의했습니다. 이것을 시도해 보시기 바랍니다 :'arrayStruct = struct ('array', [4.44, 5.55, 6.66])'. {}가 아닌 대괄호 []를 주목하십시오. – yuk

답변

1

셀 배열 인 변수에 액세스하려고합니다. MATLAB에서. 결과적으로 데이터가 저장되었는지 확신합니까? 구조체에 double 배열을 넣으면 어떻게됩니까?

matrixStruct = struct('matrix', [4, 4, 4; 5, 5, 5; 6, 6 ,6]) 

나는 문제가 셀 어레이의 방법 MATLAB 데이터를 저장라고 생각합니다. 이것을 실행 해보십시오 :

double1 = 1; 
double2 = 1:2; 
cellempty = {[]}; 
celldouble1 = {1}; 
celldouble2 = {1:2}; 
cell2doubles = {1,2}; 
whos 

출력 :

Name    Size   Bytes Class  Attributes 
    cell2doubles  1x2    136 cell     
    celldouble1  1x1    68 cell     
    celldouble2  1x1    76 cell     
    cellempty   1x1    60 cell     
    double1   1x1     8 double    
    double2   1x2    16 double    

당신은 셀 어레이의 각 요소는 숫자의 크기에 추가로 60 바이트를 차지하는 것을 볼 수 있습니다.

5

struct('field', {a b c})는 구조체의 해당 요소 필드 '필드'로 셀의 각 요소를 가하고, 셀 어레이와 같은 크기 구조체 배열을 만들어 구조체 생성자의 특별한 형태이다.

s = struct('field', {a b c}); 

이 같은 결과를 생성한다 : 즉이있다

s(1).field = a; 
s(2).field = b; 
s(3).field = c; 

문제에 대한 해결책은 다음과 같이 일정한 (비 세포) 어레이를 형성하기 위해 괄호를 사용하는 것이다 :

matrixStruct = struct('matrix', [4, 4, 4; 5, 5, 5; 6, 6 ,6]); 
+0

또 하나의 구조체 항목에 셀 배열을 정말로 원한다면 : struct ('matrix', {{4, 4, 5, 5, 5; 6, 6, 6}})'를 사용하십시오. –

0

나는 이것을 통과했다 : 나는 구조체를 가진 구조체를 가지고있다. C++에서 해당 구조는 예를 들어 double**입니다. engGetVariable(engine,MyStruct.theField)으로 필드에 액세스하려고하면 오류가 발생합니다. 나는 내가했던 구조체에 매트릭스 필드를 설정하는 데 매우 유사하게 그

// Fetch struct field using a temp variable 
std::string tempName = std::string(field_name) + "_temp"; 
std::string fetchField = tempName + " = " + std::string(struct_name) 
     + "." + std::string(field_name) + "; "; 
matlabExecute(ep, fetchField); 
mxArray *matlabArray = engGetVariable(ep, tempName.c_str()); 

// Get variable elements 
const int count = mxGetNumberOfElements(matlabArray); 
T *data = (T*) mxGetData(matlabArray); 
for (int i = 0; i < count; i++) 
    vector[i] = _isnan(data[i]) ? (T) (int) -9999 : (T) data[i]; 

// Clear temp variable 
std::string clearTempVar = "clear " + tempName + "; "; 
matlabExecute(ep, clearTempVar); 

// Destroy mx object 
mxDestroyArray(matlabArray); 

처럼 보이는 구조체에서 매트릭스 필드를 얻기 위해 MyStruct.theField를 저장하고 engGetVariable(engine, tempVar) 및 코드 를 사용하는 임시 변수를 사용 그

// Create temp variable 
mxArray* array = convertVectorToMxArray(mat, nb_rows, nb_cols); 
const std::string temp_name = array_name + "_temp"; 
int ret = engPutVariable(ep, temp_name.c_str(), array); 

// Set variable to struct field 
const std::string cmd = std::string(array_name + " = " + temp_name + "; "); 
matlabExecute(ep, cmd); 

// Delete array 
mxDestroyArray(array); 
관련 문제