2011-01-08 18 views
5

Soy nuevo en MATLAB y me gustaría extraer datos de una serie de células que obtuve de mi base de datos de conjunto de células:MATLAB y manipulación en bucle for

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' 

Ahora me gustaría agarrar la primera columna, es decir, los números 1 a 19, así como los nombres respectivos de la última columna y utilizarlos en un bucle, por ejemplo:

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

I han intentado varios intentos diferentes pero nunca logrado que sólo uno de los elementos.

Se agradece la ayuda :), gracias de antemano. axon

+0

Respuesta relacionada - http://stackoverflow.com/questions/9055015/difference-between-accessing-cell-elements-using-and-curly-braces-vs-par/9055336#9055336 –

Respuesta

6

Aunque la respuesta de sabio anterior funcionará, no es realmente correcto ni el uso eficiente de las matrices de celdas de Matlab. Puede eliminar muchas de las llamadas a funciones extrañas mediante el uso de la indexación adecuada del contenido de la matriz de celdas. puede abordar cualquier elemento de una matriz de celdas de dos maneras: () o {}. () obtiene la celda, todavía como una celda. {}, sin embargo, extrae el contenido de la celda, en su tipo de base.

Por lo tanto, sensors(1, end) es una matriz de celdas de 1x1, pero sensors{1, end} es una cadena de caracteres de 1x29.

para su problema:

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

También podría eliminar la llamada num2str() si el que obtuvo el ID del sensor como un char en lugar de un número - es decir, si el original DB buscar a que los sensores pobladas hicieron el reparto.

Además, si no hiciera más consultas desde la base de datos, podría vectorizar todo esto, pero me temo que estoy lejos de mi máquina Matlab, así que no puedo construirla desde la parte superior. de mi cabeza

+0

Gracias a ti también. Los datos que obtengo de la base de datos no se modifican y, por lo tanto, la ID del sensor es un número en lugar de una cadena o una matriz de caracteres. Gracias por explicar la diferencia entre los tipos de corsés. – aXon

0

Así es como lo harías en Octave. La sintaxis de matriz de celdas de Octave es diferente de MATLAB, por lo que podría haber una forma más directa de hacerlo.

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 

Básicamente, en Octave le matrices celulares índice mediante {} en lugar de ().

El siguiente no funciona en la octava, pero lo hace en MATLAB:

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

I index array de celdas con parens . El último elemento no funciona para mí en MATLAB, pero lo hace: allIds = cell2mat (sensors (:, 1)); La línea similar funciona para la última columna, pero rellena las cadenas con '': allIds = char (sensors (:, end)); – sage

+0

Esto lo hizo por mí: para ctr = 1: longitud (sensores); idStr = num2str (sensors {ctr, 1}); nameStr = sensors {ctr, 6}; fin; De esta manera puedo tomar la información que necesito, gracias :) La segunda también funciona, dándome ambas cosas en una matriz de doble y una serie de caracteres :) – aXon

+0

@sage - esa sintaxis es mucho más agradable. Desafortunadamente no funciona en Octave, ah bueno. – mtrw

1

Esto es un poco prolijo, ya he explicado en línea, pero aquí es la forma en que lo haría en 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

Muchas gracias, funciona genial! – aXon

+0

Realmente no es el uso más eficiente de las matrices de celdas. Te olvidaste de {} indizar. – Marc