for循环中的MATLAB和单元阵列处理

时间:2011-01-08 17:12:10

标签: arrays matlab for-loop cell

我是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 个答案:

答案 0 :(得分:6)

虽然上面的圣人的答案是有效的,但它并不适合或有效地使用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

如果您将传感器ID作为字符而不是数字提取,也可以取消num2str()调用 - 即,如果您的原始数据库获取已填充的传感器进行了转换。

另外,如果你没有从数据库中进一步查询,你可以对整个事情进行矢量化,但是我害怕我离开了我的Matlab机器,所以我无法建立那个我的头。

答案 1 :(得分:1)

这有点冗长,因为我解释了内联,但这是我在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

答案 2 :(得分:0)

这就是你在Octave中的表现。 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中,您使用{}而不是()索引单元格数组。

以下在Octave中不起作用,但在MATLAB中起作用:

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