MATLAB и обработка массива ячеек в цикле for - PullRequest
5 голосов
/ 08 января 2011

Я новичок в MATLAB и хотел бы извлечь данные из массива ячеек, который я получил из своей базы данных:

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' 

Теперь я хотел бы получить первый столбец, то есть числа от 1 до 19а также соответствующие имена в последнем столбце и использовать их в цикле for, например:

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

Я пробовал несколько разных попыток, но так и не смог получить хотя бы один из элементов.

Помощь приветствуется :), спасибо заранее.Аксон

Ответы [ 3 ]

6 голосов
/ 09 января 2011

Хотя ответ мудреца, приведенный выше, сработает, это не совсем правильное или неэффективное использование клеточных массивов Matlab. Вы можете исключить многие посторонние вызовы функций, используя правильную индексацию содержимого массива ячеек. Вы можете обращаться к любому элементу массива ячеек двумя способами - () или {}. () получает клетку, все еще как клетку. {} однако, вытаскивает содержимое ячейки в ее базовом типе.

То есть sensors(1, end) - это массив ячеек 1x1, но sensors{1, end} - это строка символов 1x29.

Для вашей проблемы:

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

Вы также можете исключить вызов num2str(), если вы выбрали идентификатор датчика в виде символа, а не числа, т. Е. Если исходная выборка из базы данных, заполненная датчиками, была приведена.

Кроме того, если бы вы больше не обращались к БД, вы могли бы векторизовать все это, но я боюсь, что я далеко от своей машины Matlab, поэтому я не могу собрать ее с вершины моя голова.

1 голос
/ 08 января 2011

Это немного многословно, потому что я объяснил inline, но вот как я бы это сделал в 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 голосов
/ 08 января 2011

Вот как бы вы сделали это в Октаве.Синтаксис массива ячеек Octave отличается от синтаксиса MATLAB, поэтому может быть более прямой путь к нему.

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

По сути, в Octave вы индексируете массивы ячеек, используя {} вместо (). * 1006.*

Следующее не работает в Octave, но работает в MATLAB:

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