标引的目的主要是为了获得价值。在MatLab中,对于单元数组,有内容索引({}),因此单元索引(())只用于从单元数组中选择子集,对吗?它还有其他高级用途吗?比如将其用作指针并将其传递给函数?
{}
()
5ssjco0h1#
有一个高度简化的答案。{}-索引返回内容,()-索引创建具有索引元素的子单元格。让我们举一个简单的例子:
>> 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来说,真正特别的是使用非标量索引的{}索引。它返回一个包含所有内容的Comma-Separated List。现在这里正在发生的事情是:
>> 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不使用指针,也没有对其进行补充(除了面向对象的MatLab中的handle),但MatLab在优化内存使用方面非常强大。特别是使用Copy-on-write使得在大多数情况下没有必要使用指针。通常,您最终会得到如下函数
handle
M=myMatrixOperation(M,parameter,parameter2)
在那里您输入数据并返回数据。
1条答案
按热度按时间5ssjco0h1#
有一个高度简化的答案。{}-索引返回内容,()-索引创建具有索引元素的子单元格。让我们举一个简单的例子:
现在继续使用非标量元素。对于()-索引一切都按预期运行,您将收到一个包含元素的子单元格:
对于MatLab来说,真正特别的是使用非标量索引的{}索引。它返回一个包含所有内容的Comma-Separated List。现在这里正在发生的事情是:
逗号分隔的列表的行为类似于具有两个返回参数的函数。如果只需要一个值,则只分配一个值。第二个值丢失。您还可以使用此选项一次将多个元素分配给各个列表:
现在,最后来看一个逗号分隔列表的非常强大的用例。假设您有一些愚蠢的函数foo,它需要许多输入参数。在您的代码中,您可以编写类似以下内容:
或者,假设您的所有参数都存储在一个单元格中:
或者,您可以使用逗号分隔的列表调用该函数。假设a有6个元素,则此行完全等同于前一行:
这里为输入参数演示的相同技术也可以用于输出参数。
关于你最后一个关于指针的问题。MatLab不使用指针,也没有对其进行补充(除了面向对象的MatLab中的
handle
),但MatLab在优化内存使用方面非常强大。特别是使用Copy-on-write使得在大多数情况下没有必要使用指针。通常,您最终会得到如下函数在那里您输入数据并返回数据。