Matlab数组有奇怪的语法

时间:2014-10-03 02:31:06

标签: matlab cell-array

在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)= []所示,使用{}的机制是什么?

由于

2 个答案:

答案 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}}来获取它的元素,...希望有道理!