无论出于何种原因,Matlab 都不允许重复圆括号 () - 迭代器。这阻止了对多维数组函数输出的直接访问,并使字典对象不可变,以及其他应用程序。
例如
func1=@(x)[sin(x);cos(x)];
% let S be some large struct where everything is stored
func2=@(str)S.(str);
% let D be some containers.Map object where everything is stored
D(key)=[1;2];
在上述所有 3 种情况下,能够直接访问数组元素很有用。但任何
func1(Pi)(i); func2(f1)(i); D(key)(i)
将导致错误
()-indexing must appear last in an index expression.
除了创建一个临时变量之外,还有什么吗?
同样,如果您的答案是临时变量是唯一的方法,您能否告诉我创建第二个变量是否会导致内存中的数据重复?
-
对于第一个函数,您可以使用
getfield
(但是没有记录getfield
的这种使用,所以我不推荐它):>> func1 = @(x) [sin(x); cos(x)]; >> func1(4.8) ans = -0.9962 0.0875 >> getfield(func1(4.8), {1}) ans = -0.9962
或者,您可以定义一个索引函数来提取所需的元素:
>> index = @(x,n) x(n); >> index(func1(4.8), 1) ans = -0.9962
另一种可能性是将
func1
定义为函数的(单元格)数组,而不是数组值函数,以便您可以单独引用每个值:>> func1 = {@(x) sin(x), @(x) cos(x)}; >> func1{1}(4.8) ans = -0.9962
-
对于第二个函数,上述前两种方法适用:
>> S.fieldA = [11 22 33]; >> func2 = @(str) S.(str); >> getfield(func2('fieldA'), {3}) ans = 33 >> index(func2('fieldA'), 3) ans = 33
-
对于
containers.Map
,应用两次getfield
似乎也有效(同样,我不推荐它):>> D = containers.Map({'abc', 'def'}, {10, [20 30]}); >> getfield(getfield(D,{'def'}), {2}) ans = 30
或者使用索引功能:
>> index(D('def'), 2) ans = 30
我会推荐索引函数方法,这种方法既安全又通用。
有一种方法,它就在SO:这个问题上。然而,就像评论说的那样,它非常丑陋,临时变量方式更具可读性。
至于您的后续问题,通常将相同的数组分配给不同的变量不会生成深层副本,只会重复引用。这一直适用,直到您使用复制的引用修改数组,此时 Matlab 介入并执行深层复制。请参阅这篇关于该主题的 Mathworks 文章。