【问题标题】:MATLAB and cell array handling in for loopfor 循环中的 MATLAB 和元胞数组处理
【发布时间】:2011-06-05 19:46:13
【问题描述】:

我是 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

我尝试了几种不同的尝试,但从未成功获得其中一个元素。

感谢您的帮助 :),在此先感谢。 轴突

【问题讨论】:

标签: arrays matlab for-loop cell


【解决方案1】:

虽然上面 sage 的回答会起作用,但它并不是真正正确或有效地使用 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 机器,所以我无法在顶部构建那个我的头。

【讨论】:

  • 也谢谢你。我从数据库中获取的数据没有改变,因此传感器 ID 是数字而不是字符串或字符数组。感谢您解释大括号类型之间的区别。
【解决方案2】:

这就是您在 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}

【讨论】:

  • 我用括号索引单元格数组。最后一项在 MATLAB 中对我不起作用,但确实如此: allIds = cell2mat(sensors(:,1));类似的行适用于最后一列,但用 ' ' 填充字符串: allIds = char(sensors(:,end));
  • 这是为我做的:for ctr = 1:length(sensors); idStr = num2str(传感器{ctr,1}); nameStr=传感器{ctr,6};结尾;这样我就可以获取我需要的信息,谢谢:)第二个也可以,给我一个双精度数组和一个字符数组的东西:)
  • @sage - 语法要好得多。不幸的是,它在 Octave 中不起作用,嗯。
  • @aXon - 见 sage 的回答,事实证明 Matlab 可以使用括号。
  • @mtrw:如果你不介意,我确实编辑了你关于单元格索引的帖子。
【解决方案3】:

这有点冗长,因为我解释了内联,但这是我在 MATLAB 中的做法:

[nRows, nCols] = 尺寸(传感器); % 获取行数和列数 对于 currRow = 1:nRows % 下面选择当前行和第一列,得到 % ID,然后将其转换为数字再转换为字符串 firstColAsStr = num2str(cell2mat(sensors(currRow,1))); % 下面选择当前行和最后一列,已知 % 是一个包含字符串的单元格,并直接转换为字符 % 数组,也就是一个字符串 lastColAsStr = char(传感器(currRow,nCols)); % 在此处插入您想要对项目执行的操作(例如,您的 SQL % 命令) 结尾

【讨论】:

  • 并不是最有效地使用元胞数组。您忘记了 {} 索引。
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 2014-02-05
  • 2017-10-02
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多