2011-01-08 15 views
5

için işleme hücreli dizi:MATLAB ve ben MATLAB'a yeniyim ve benim veritabanından var bir hücre dizisi veri ayıklamak istiyorum döngü

sensors = 

[ 1] [23] [1] [ 0] [0.1000]   [1x29 char] 
[ 2] [23] [1] [120] [0.1000]   [1x43 char] 
[ 3] [23] [1] [120] [0.1000]   [1x42 char] 
[ 4] [23] [1] [ 15] [0.1000] 'Air Temp Grey Box' 
[ 5] [23] [1] [120] [0.1000]   [1x34 char] 
[ 6] [23] [1] [120] [0.1000]   [1x33 char] 
[ 7] [23] [1] [120] [0.1000] 'Pool Water Temp' 
[ 8] [23] [2] [ 0] [0.1000]   [1x28 char] 
[ 9] [23] [1] [ 30] [0.1000]   [1x22 char] 
[10] [23] [1] [ 30] [0.1000]   [1x22 char] 
[11] [23] [1] [ 30] [0.1000]   [1x21 char] 
[12] [23] [1] [ 15] [0.1000]   [1x20 char] 
[13] [23] [1] [ 15] [0.1000]   [1x23 char] 
[14] [23] [1] [ 30] [0.1000]   [1x22 char] 
[15] [23] [1] [ 15] [0.1000] 'Ground Air '  
[16] [23] [1] [ 5] [0.1000] 'Boiler Cold Water' 
[17] [23] [1] [ 5] [0.1000] 'Boiler Hot Water' 
[18] [23] [1] [ 5] [0.1000] 'Boiler CH Flow' 
[19] [23] [1] [ 5] [0.1000] 'Boiler CH Return' 

Şimdi ilk sütunu kapmak istiyorum, yani sayılar 1 ile 19 yanı sıra son sütunda ilgili isimler ve döngü için bunları kullanmak, örneğin:

for ID=xxxx 
    str = num2str(ID); 
    SQLcommand = strcat('SELECT FROM data where ID=',str); 
    answer = database.exec(SQLcommand); 
    ...... 
end 

Ben birkaç farklı girişimleri çalıştı ama sadece elemanlardan birini elde etme konusunda başarılı olmadı.

Yardımı minnettar :), şimdiden teşekkürler. akson

+0

İlgili yanıt - http://stackoverflow.com/questions/9055015/difference-between-accessing-cell-elements-using-and-curly-braces-vs-par/9055336#9055336 –

cevap

6

Yukarıdaki adaçanın cevabı işe yarayacak olsa da, Matlab'ın hücre dizilerinin gerçekten uygun ya da verimli kullanımı değildir. Doğru hücre dizisi içeriği indekslemesini kullanarak yabancı işlev çağrılarının çoğunu ortadan kaldırabilirsiniz. Bir hücre dizisinin herhangi bir elemanını iki şekilde ele alabilir - () veya {}. (), hücreyi hala bir hücre olarak alır. Ancak, {}, hücrenin içeriğini taban türünde dışarı çeker.

Yani 10 1x1 hücre dizisidir, ancak sensors{1, end} 1x29 karakterlik bir dizedir. senin sorun için

: - Orijinal DB nüfuslu sensörler döküm yaptığını getirme durumunda yani oturum bir char yerine bir sayı olarak sensör kimliği getirilen eğer

numRows = size(sensors, 1); 
for rowIdx = 1:numRows; 
    sensorName = sensors{rowIdx, end}; 
    sql = ['select * from data where ID = ' num2str(sensors{rowIdx, 1})]; 
    ... 
end 

Ayrıca num2str() aramayı ortadan kaldırabilir. Ayrıca, DB'den daha fazla sorgulama yapmamış olsaydınız, buna ek olarak, tüm bu şeyi deşifre edebilirdiniz, fakat korkarım ki, Matlab makinemden uzaktayım, bu yüzden onu bir daha inşa edemiyorum. başımın

+0

Size de teşekkürler. DB'den aldığım veriler değişmez ve bu nedenle sensör kimliği bir dize veya karakter dizisi yerine bir sayıdır. Brace tipleri arasındaki farkı açıkladığınız için teşekkür ederiz. – aXon

0

Bunu Octave'de nasıl yaparsınız. Oktavun hücre dizisi sözdizimi MATLAB'lardan farklıdır, dolayısıyla daha doğrudan bir yol olabilir.

for ctr = 1:length(sensors) 
    idstr = num2str(sensors{ctr}{1}); %# get the first column of the ctr''d row 
    namestr = sensors{ctr}{6}; %# get the sixth column of the ctr''d row 
    ... 
end 

Temelde, Octave Dizin hücre diziler {} yerine () kullanarak.

şu MATLAB'da Octave çalışır, ancak does değildir:

allIds = cell2mat(sensors(:,1)); %# or maybe sensors{:,1} 
+0

Ben parensli dizin dizileri . Son madde MATLAB'da benim için işe yaramıyor, fakat şunu yapar: allIds = cell2mat (sensörler (:, 1)); Benzer satır son sütun için çalışır, ancak dizeleri '': allIds = char (sensor (:, end)) ile pedler; – sage

+0

Bu benim için yaptı: ctr = 1: uzunluk (sensörler); idStr = num2str (sensörler {ctr, 1}); nameStr = sensörler {TO, 6}; son; Bu şekilde ihtiyacım olan bilgiyi yakalayabilirim, teşekkürler :) İkincisi de, her iki şeyi bir dizi çift ve bir dizi ardı ardına veriyor :) – aXon

+0

@sage - bu sözdizimi çok daha güzel. Ne yazık ki, Octave'de işe yaramıyor, ah iyi. – mtrw

1

Bu işte ben inline açıkladı çünkü biraz ayrıntılı, ama MATLAB'da bunu görecektir:

 
[nRows, nCols] = size(sensors); % get the numbers of rows and columns 
for currRow = 1:nRows 
    % The following selects the current row and the first column, gets the 
    % ID, and then converts it to a number and then a string 
    firstColAsStr = num2str(cell2mat(sensors(currRow,1))); 

    % The following selects the current row and the last column, known to 
    % be a cell containing a string, and converts directly to a character 
    % array, aka a string 
    lastColAsStr = char(sensors(currRow,nCols)); 

    % Insert here what you want to do with the items (e.g., your SQL 
    % commands) 

end 
+0

Çok teşekkürler, harika çalışıyor! – aXon

+0

Gerçekten hücre dizilerinin en verimli kullanımı değil. {} Indekslemeyi unuttun. – Marc