2010-05-11 18 views
6

Matlab yapısında bir alanda saklanan matrisin mex işlevinden nasıl erişileceğini anlamaya çalışıyorum. çok uzun soluklu oluyorMatlab yapısındaki bir matris bir mex işlevinden nasıl erişilir?

... Açıklayayım:

aşağıdaki gibi tanımlanmış bir matlab yapı var: Ben olmak istiyorum hangi bir mex fonksiyonu var

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

Matristeki ilk elemana bir işaretçi atama (matris [0] [0], c cinsinden), ancak bunu nasıl yapacağımı anlayamadım.

denedim aşağıdadır:

/* 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))); 
} 

Bunun yazdırma biter takip ediyor: belki de birlikte sakat bir şey olduğunu düşünerek, aşağıdakilerden

4.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 

Ben de denedim varyasyonlar iç içe geçmiş işlev çağrıları, ancak boşuna:

Ne yapmaya çalıştığımı veya neyi yanlış yaptığımı nasıl anlayabilirim?

Teşekkürler!

Düzenleme: Her bir kullanıcının yorumuna göre, tek boyutlu bir ikilelik dizisi olan array adlı alana sahip bir yapıda benzer işlemler yapmayı denedim.

aşağıdaki gibi diziyi içeren yapı tanımlanır:

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

Ben mex işlev içinde arrayStruct aşağıdaki çalıştı:

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

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

... ama çıkış neydi izledi Daha önce basılmış:

+0

Sadece bazı düşüncelerle mex dosyaları hakkında çok fazla deneyimim yok. MATLAB içindeki hücre dizisi olan değişkene erişmeye çalışıyorsunuz. Sonuçta verilerin saklandığından emin misiniz? Yapının içine çift dizi koyarsanız ne olur? matrixStruct = struct ('matrix', [4, 4, 4; 5, 5, 5; 6, 6, 6]) ' – yuk

+0

yuk - Bana sorduğum soruya eklediklerim var mı? yap. –

+0

Hayır, hala hücre dizisini tanımladınız. Bunu denemenizi isterim: 'arrayStruct = struct ('array', [4.44, 5.55, 6.66])'. Köşeli parantezlere dikkat edin [], değil {}. – yuk

cevap

1

Hücre dizisi olan değişkene erişmeye çalışıyorsunuz MATLAB içinde. Sonuçta verilerin saklandığından emin misiniz? Yapının içine çift dizi koyarsanız ne olur?

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

Sorun hücre dizisinde nasıl MATLAB verileri saklar olduğunu düşünüyorum. Bu çalıştırmayı deneyin:

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

çıkışı:

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    

Sen hücre dizisinin her bir elemanı sayılarının büyüklüğüne ek 60 bayt işgal olduğunu görebilirsiniz.

5

struct('field', {a b c}) yapı karşılık gelen elemanın alanın 'alanına içine, her bir hücre elemanını koyarak, hücre dizisi aynı boyutta olan bir yapı dizi oluşturur yapı kurucu özel bir formudur.

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

bu da aynı sonucu üretir: ki bu,

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

sorunun çözümü için, bu gibi bir normal (non-hücresi) dizisi oluşturacak şekilde köşeli parantezleri kullanmaktır:

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

Alternatif olarak, tek bir yapı öğesinde gerçekten bir hücre dizisi istiyorsanız: 'struct (' matrix ', {{4, 4, 4; 5, 5, 5; 6, 6, 6}}) 'kullanın. –

0

Şu an bunun üzerinden bir matris olan bir alanım var. C++ 'da ilgili yapı örneğin double**'dur. Alana engGetVariable(engine,MyStruct.theField) ile erişmeye çalışmak başarısız oluyor. Ben yaptım yapı için matris alanını ayarlamak için çok benzer olduğunu

// 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); 

benziyor yapı dan matris alanını elde etmek MyStruct.theField depolamak ve daha sonra engGetVariable(engine, tempVar) ve kod kullanmak için bir geçici değişken kullanın

// 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); 
İlgili konular