在Matlab中,我们使用textscan从文件或某个地方获取单元格数组。但是细胞阵列的行为是如此奇怪。 有示例代码:
>> str = '0.41 8.24 3.57 6.24 9.27';
>> C = textscan(str, '%3.1f %*1d');
>> C
C =
[5x1 double]
我们可以知道C是一个大小为5 * 1的单元格数组。当我使用C {1},C {1} {1}和C(1)时。我得到以下结果:
>> C{1}
ans =
0.4000
8.2000
3.5000
6.2000
9.2000
>> C{1}{1}
Cell contents reference from a non-cell array object.
>> C(1)
ans =
[5x1 double]
为什么我不能使用C {1} {1}从单元格数组中获取元素?那么如何从该单元格数组中获取元素呢?
我在互联网上找到的一个例子是:
%% First import the words from the text file into a cell array
fid = fopen(filename);
words = textscan(fid, '%s');
%% Get rid of all the characters that are not letters or numbers
for i=1:numel(words{1,1})
ind = find(isstrprop(words{1,1}{i,1}, 'alphanum') == 0);
words{1,1}{i,1}(ind)=[];
end
正如单词{1,1} {i,1}(ind)= []所示,使用{}的机制是什么?
由于
答案 0 :(得分:3)
然后我如何从该单元格数组中获取元素?
C = C{:}; % or C = C{1};
按C(1)
,C(2)
等方式访问值
答案 1 :(得分:2)
索引到单元格数组和数值数组的语法略有不同。你的输出
>> C
C =
[5x1 double]
告诉你,你所拥有的是一个1x1的单元阵列,并且在那个单元格中是一个5x1的双精度数组。使用{}
将单元格数组编入索引,而正常情况下使用()
进行索引。使用C{1}(1)
将数组编入索引。
因此,您希望索引单元格数组的第一个元素,然后使用C{1}(2)
索引到5x1双精度数组中的第一个值。要获得第二个值 - A(n)
,等等。
如果您熟悉其他编程语言,则单元格数组就像指针数组;运算符A{n}
用于获取数组A的第n个元素,而A{n}
获取数组A的第n个元素所指向的对象(或者包含在第n个单元格中的对象)单元阵列A')。如果A不是单元格数组,C{1}
将失败。
所以,知道C是一个单元格数组,这就是为什么你得到了你所尝试的案例 -
C{1}{1}
返回C的第一个单元格中包含的5x1双数组。
C(1)
获取包含在C的第一个单元格中的对象(称为B),然后尝试获取包含在B的第一个单元格中的对象。它失败,因为B不是单元格数组,它是一个5x1双阵列。
C
返回C{1}(1)
的第一个元素,它是一个包含5x1双数组的单个单元格。
但是C
会让你获得C{1}(1)
的第一个单元格中包含的5x1数组的第一个元素,这正是你要找的。正如我上面的@Cheery所指出的那样,它可能更容易,而不是写C{1}(2)
,C
,...来删除'单元级'通过设置C = C {1}进行索引,这意味着C(1)
现在是一个5x1双数组,您可以使用C(2)
,{{1}}来获取它的元素,...希望有道理!