MATLAB中细胞索引的作用是什么?

3
索引的主要目的是获取值。在MATLAB中,对于单元数组,有内容索引({}),因此单元索引(())仅用于从单元数组中选择子集,是吗?
除了这个用法,还有其他高级用法吗?比如将其用作指针并将其传递给函数?

1
如果答案解决了您的问题,请考虑通过点击复选标记接受它。这表示您已找到解决方案,问题已不再是开放性问题。如果您的问题未得到回答,请说明缺少什么。 - Daniel
1个回答

4
这里有一个非常简化的答案。{}-索引会返回内容,() -索引会创建一个包含索引元素的子单元格。让我们来看一个简单的例子:
>> a=x(2)

a = 

    [2]

>> class(a)

ans =

cell

>> b=x{2}

b =

     2

>> class(b)

ans =

double

现在我们继续讨论非标量元素。对于()索引,一切都表现得如预期一样,您会收到一个包含元素的子单元。
>> a=x(2:3)

a = 

    [2]    [3]

Matlab中真正特别的是使用非标量索引进行{}索引。它返回一个包含所有内容的逗号分隔列表。现在这里发生了什么:
>> b=x{2:3}

b =

     2

逗号分隔列表类似于具有两个返回值的函数。您只需要一个值,只会分配一个值。第二个值将丢失。您也可以使用此方法一次性将多个元素分配给单独的列表:

>> [a,b]=x{2:3} %old MATLAB versions require deal here

a =

     2


b =

     3

现在,最终来到逗号分隔列表非常强大的使用案例。假设你有一个需要许多输入参数的愚蠢函数foo。在你的代码中,你可以写出类似这样的内容:
foo(a,b,c,d,e,f)

假设您已将所有参数存储在单元格中,那么:
foo(a{1},a{2},a{3},a{4},a{5},a{6})

另外,您也可以使用逗号分隔的列表调用函数。假设a有6个元素,则此行与前面的完全等效:

foo(a{:}) %The : is a short cut for 1:end, index the first to the last element

这里展示的用于输入参数的技术同样适用于输出参数。
关于指针的问题,Matlab不使用指针,也没有它的补充(除了oop Matlab中的handle),但Matlab在优化内存使用方面非常强大。特别是使用Copy-on-write,在大多数情况下不需要指针。通常你会得到像以下这样的函数:
M=myMatrixOperation(M,parameter,parameter2)

您输入数据并返回它的地方。


所以基本上,() 能做的事情,{} 也能做,而且还可以获取内容,那么为什么我们还需要 () 呢? - totally
你总是可以用{x{2:3}}替换x(2:3)。除了节省一些字符外,对于具有相同行为的单元格和矩阵,使用()索引可以简化可以处理两者的函数。 - Daniel
请注意,只有当结果是一维单元数组时,才能使用{x{...}}替换x(...)索引。例如,x(:,1:3)无法以其他方式完成。这两种索引形式是不同的,您需要同时使用它们来正确地使用单元数组。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接