@mtrw: Если вы не возражаете, я редактировал ваш пост, касающийся индексации ячеек.

ичок в 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

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

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

 Andrey Rubshtein20 нояб. 2014 г., 17:12
Соответствующий ответ -stackoverflow.com/questions/9055015/...

Ответы на вопрос(3)

Решение Вопроса

это не совсем правильное или неэффективное использование клеточных массивов 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, поэтому я не могу собрать ее с моей головы.

 aXon09 янв. 2011 г., 23:38
Спасибо и тебе. Данные, которые я извлекаю из БД, не изменяются, и поэтому идентификатор датчика является числом, а не строкой или массивом символов. Спасибо, что объяснили разницу между типами фигурных скобок.

ичается от синтаксиса 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 вы индексируете массивы ячеек, используя{} вместо().

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

allIds = cell2mat(sensors(:,1)); %# or maybe sensors{:,1}
 sage08 янв. 2011 г., 18:58
Я индексирую массивы клеток с помощью паренов. Последний элемент не работает для меня в MATLAB, но это так: allIds = cell2mat (sensor (:, 1)); Аналогичная строка работает для последнего столбца, но дополняет строки с помощью '': allIds = char (sensor (:, end));
 zellus08 янв. 2011 г., 20:59
@mtrw: Если вы не возражаете, я редактировал ваш пост, касающийся индексации ячеек.
 mtrw08 янв. 2011 г., 19:12
@aXon - посмотрите ответ мудреца, оказывается, Matlab может использовать скобки.
 aXon08 янв. 2011 г., 19:05
Это сделало это для меня: для ctr = 1: длина (датчики); idStr = num2str (sensor {ctr, 1}); NameStr = {датчики CTR, 6}; конец; Таким образом, я могу получить информацию, которая мне нужна, спасибо :) Второй тоже работает, давая мне обе вещи в массиве double и массиве символов :)
 mtrw08 янв. 2011 г., 19:08
@sage - этот синтаксис намного приятнее. К сожалению, это не работает в Октаве, ну хорошо.

потому что я объяснил 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
 Marc09 янв. 2011 г., 15:59
Не самое эффективное использование клеточных массивов. Вы забыли про {} индексацию.
 aXon08 янв. 2011 г., 20:07
Большое спасибо, прекрасно работает!

Ваш ответ на вопрос