2011-01-08 5 views
5

Je suis nouveau à Matlab et voudrais extraire des données à partir d'un réseau de cellules que je suis de ma base de données:Matlab et matrice de cellules manutention dans boucle

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' 

Maintenant, je voudrais saisir la première colonne, dire les numéros 1 à 19, ainsi que les noms respectifs dans la dernière colonne et les utiliser dans une boucle, par exemple:

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

J'ai essayé plusieurs tentatives différentes mais jamais réussi à obtenir que l'un des éléments.

L'aide est appréciée :), merci d'avance. axon

+0

Réponse associée - http://stackoverflow.com/questions/9055015/difference-entre-accessing-cell-elements-using-and-curly-braces-vs-par/9055336#9055336 –

Répondre

6

Bien que la réponse de sauge ci-dessus fonctionne, elle n'est pas vraiment appropriée, ou l'utilisation efficace des matrices de cellules de Matlab. Vous pouvez éliminer un grand nombre des appels de fonctions externes en utilisant l'indexation de contenu de tableau de cellules appropriée. vous pouvez adresser n'importe quel élément d'un tableau de cellules de deux manières: () ou {}. () obtient la cellule, toujours sous forme de cellule. {} cependant, extrait le contenu de la cellule, dans son type de base.

Donc sensors(1, end) est un tableau de cellules 1x1, mais sensors{1, end} est une chaîne de caractères 1x29.

Pour votre problème:

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

Vous pouvez également éliminer l'appel num2str() si vous alla chercher l'ID du capteur comme caractère au lieu d'un numéro - à savoir si votre chercher DB d'origine que les capteurs peuplés ont fait le casting. En outre, si vous n'avez pas encore interrogé la base de données, vous pourriez vectoriser tout cela, mais j'ai peur de m'éloigner de ma machine Matlab, donc je ne peux pas construire celle-là du haut de ma tête.

+0

Merci à vous aussi. Les données que je récupère à partir de la base de données ne sont pas modifiées et, par conséquent, l'ID du capteur est un nombre au lieu d'une chaîne ou d'un tableau char. Merci d'expliquer la différence entre les types d'accolades. – aXon

0

Voici comment vous le feriez dans Octave. La syntaxe de matrice de cellules d'Octave est différente de celle de MATLAB, donc il y a peut-être une façon plus directe de le faire.

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 

Fondamentalement, Octave vous réseaux de cellules d'index à l'aide {} au lieu de ().

Ce qui suit ne fonctionne pas dans Octave, mais fait dans Matlab:

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

I index tableaux de cellules avec parens . Le dernier élément ne fonctionne pas pour moi dans MATLAB, mais c'est le cas: allIds = cell2mat (sensors (:, 1)); La ligne similaire fonctionne pour la dernière colonne, mais remplit les chaînes avec '': allIds = char (sensors (:, end)); – sage

+0

Cela l'a fait pour moi: pour ctr = 1: longueur (capteurs); idStr = num2str (capteurs {ctr, 1}); nameStr = capteurs {ctr, 6}; fin; De cette façon, je peux saisir les informations dont j'ai besoin, merci :) Le second fonctionne aussi, me donnant les deux choses dans un tableau de double et un tableau de caractères :) – aXon

+0

@sage - cette syntaxe est beaucoup plus agréable. Malheureusement, cela ne fonctionne pas dans Octave, ah bien. – mtrw

1

C'est un peu bavard parce que je l'ai expliqué en ligne, mais voici comment je le ferais dans Matlab:

 
[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

Merci beaucoup, ça marche super! – aXon

+0

Pas vraiment l'utilisation la plus efficace des réseaux de cellules. Vous avez oublié l'indexation {}. – Marc

Questions connexes