2011-01-08 13 views
5

Ich bin neu in MATLAB und mochte Daten aus einem Zellenfeld extrahieren, die ich aus meiner Datenbank bekam:MATLAB und Zellenfeld für Schleife Handling in

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' 

Jetzt würde ich gerne die erste Spalte packen, dh die Zahlen 1 bis 19 sowie die entsprechenden Namen in der letzten Spalte und sie in einer for-Schleife, zB:

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

ich habe versucht, mehrere verschiedene Versuche, aber nie in immer nur eines der Elemente gelungen.

Hilfe wird geschätzt :), danke im Voraus. axon

+0

Ähnliche Antwort - http://stackoverflow.com/questions/9055015/difference-between-accessing-cell-elements-use-and-curly-brace-vs-par/9055336#9055336 –

Antwort

6

Obwohl Salbeis obige Antwort funktioniert, ist es nicht wirklich richtig oder effizient, Matlabs Zellenarrays zu verwenden. Sie können viele der überflüssigen Funktionsaufrufe eliminieren, indem Sie die Inhaltsindex-Indexierung für Zellen ordnungsgemäß verwenden. Sie können jedes Element eines Zellen-Arrays auf zwei Arten adressieren - () oder {}. () bekommt die Zelle immer noch als Zelle. {} zieht jedoch den Inhalt der Zelle in seinem Basistyp heraus.

Also sensors(1, end) ist ein 1x1-Zellen-Array, aber sensors{1, end} ist eine 1x29 Char-Zeichenfolge.

Für Ihr Problem:

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

Sie könnten auch den num2str() Anruf beseitigen, wenn Sie die Sensor-ID als Zeichen statt einer Nummer geholt - das heißt, wenn das Original DB holen, dass besiedelte Sensoren die Besetzung haben.

Außerdem, wenn Sie nicht weiter aus der Datenbank abfragen, könnten Sie diese ganze Sache vektorisieren, aber ich fürchte, ich bin von meiner Matlab-Maschine entfernt, also kann ich diese nicht von der Spitze bauen von meinem Kopf.

+0

Danke auch Ihnen. Die Daten, die ich von der DB abrufe, sind unverändert, und daher ist die Sensor-ID eine Nummer anstelle eines String- oder Char-Arrays. Danke, dass Sie den Unterschied zwischen den geschweiften Klammern erklärt haben. – aXon

0

So würden Sie es in Octave machen. Octaves Zellenarraysyntax unterscheidet sich von MATLABs, daher könnte es einen direkteren Weg geben.

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 

Grundsätzlich in Octave Sie Index Zellenanordnungen mit {} statt ().

Die folgende nicht in Octave arbeiten, aber tut in MATLAB:

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

Ich Index-Zellen-Arrays mit Parens . Das letzte Element funktioniert bei mir nicht in MATLAB, aber das tut: allIds = cell2mat (Sensoren (:, 1)); Die ähnliche Zeile funktioniert für die letzte Spalte, füllt die Strings jedoch mit '': allIds = char (Sensoren (:, end)); – sage

+0

Das war es für mich: für ctr = 1: Länge (Sensoren); idStr = num2str (Sensoren {ctr, 1}); nameStr = Sensoren {ctr, 6}; Ende; Auf diese Weise kann ich mir die Informationen holen, die ich brauche, danke :) Die zweite funktioniert auch und gibt mir beide Dinge in einer Reihe von doppelten und einer Reihe von Zeichen :) – aXon

+0

@sage - diese Syntax ist viel schöner. Leider funktioniert es in Octave nicht, ach gut. – mtrw

1

Dies ist ein bisschen ausführlicher, weil ich inline erklärt, aber hier ist, wie ich es in MATLAB tun würde:

 
[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

Vielen Dank, funktioniert super! – aXon

+0

Nicht wirklich die effizienteste Verwendung von Zellenarrays. Sie haben die {} Indizierung vergessen. – Marc

Verwandte Themen