我如何索引一个函数返回的MATLAB数组,而不先将它分配给一个局部variables?

例如,如果我想从magic(5)读取中间值,我可以这样做:

 M = magic(5); value = M(3,3); 

得到value == 13 。 我希望能够做到这样的事情之一:

 value = magic(5)(3,3); value = (magic(5))(3,3); 

省去中间variables。 然而,MATLAB在第三个括号之前抱怨了Unbalanced or unexpected parenthesis or bracket括号。

是否有可能从一个数组/matrix中读取值,而不先将其分配给一个variables?

它实际上可以做你想做的,但只有当你使用索引操作符的functionforms。 使用()执行索引操作时,实际上是在调用SUBSREF函数。 所以,即使你不能这样做:

 value = magic(5)(3,3); 

可以这样做:

 value = subsref(magic(5),struct('type','()','subs',{{3,3}})); 

丑,但可能,;)

一般来说,只需将索引步骤更改为函数调用,这样就不会有两组括号紧跟在一起。 另一种方法是定义你自己的匿名函数来执行下标索引:

 subindex = @(A,r,c) A(r,c); %# An anonymous function to index a matrix value = subindex(magic(5),3,3); %# Use the function to index the matrix 

然而,当所有的说法和做完临时局部variables的解决scheme是更可读,而且我肯定会build议。

几天前刚刚在Matlab上 发表了关于Loren的 一篇很好的博文 ,里面有一些可能有用的gem。 特别是使用如下帮助函数:

 paren = @(x, varargin) x(varargin{:}); curly = @(x, varargin) x{varargin{:}}; 

paren()可以用在哪里

 paren(magic(5), 3, 3); 

会返回

 ans = 16 

我也会猜测,这将比gnovice的答案更快,但我没有检查(使用探查器!!!)。 这就是说,你也必须包含这些函数定义的地方。 我个人在我的道路上使他们独立的function,因为他们是超级有用的。

这些函数和其他函数现在可以通过MATLAB Add-On Explorer或File Exchange获得 。

您如何使用未logging的function:

 >> builtin('_paren', magic(5), 3, 3) %# M(3,3) ans = 13 

或者对于单元arrays:

 >> builtin('_brace', num2cell(magic(5)), 3, 3) %# C{3,3} ans = 13 

就像神奇:)


更新:

坏消息是,上面的黑客在R2015b中已经不起作用了! 这很好,它是无证的function,我们不能依靠它作为支持的function:)

对于那些想知道在哪里可以find这种types的东西,请查看文件夹fullfile(matlabroot,'bin','registry') 。 有一堆XML文件列出各种好东西。 被警告,直接调用这些函数可能会很容易导致你的MATLAB会话崩溃。

至less在MATLAB 2013a中,您可以使用getfield

 a=rand(5); getfield(a,{1,2}) % etc 

得到(1,2)的元素

不幸的是像magic(5)(3,3)这样的语法不被matlab支持。 你需要使用临时的中间variables。 你可以在使用后释放内存,例如

 tmp = magic(3); myVar = tmp(3,3); clear tmp 

请注意,如果比较运行时间和标准方式(分配结果,然后访问条目),则它们完全相同。

 subs=@(M,i,j) M(i,j); >> for nit=1:10;tic;subs(magic(100),1:10,1:10);tlap(nit)=toc;end;mean(tlap) ans = 0.0103 >> for nit=1:10,tic;M=magic(100); M(1:10,1:10);tlap(nit)=toc;end;mean(tlap) ans = 0.0101 

在我看来,底线是:MATLAB没有指针,你必须忍受它。

干杯

如果你做一个新的function可能会更简单:

 function [ element ] = getElem( matrix, index1, index2 ) element = matrix(index1, index2); end 

然后使用它:

 value = getElem(magic(5), 3, 3); 

您的初始表示法是最简单的方法:

 M = magic(5); %create value = M(3,3); % extract useful data clear M; %free memory 

如果你正在循环执行这个操作,你可以每次重新指定M而忽略清晰的语句。

为了补充Amro的答案,你可以使用feval而不是builtin 。 实际上,没有区别,除非您尝试重载运算符函数:

BUILTIN(…)与FEVAL(…)相同,只是它将调用函数的原始内置版本,即使存在重载的版本(为此,您不能超载BUILTIN)。

 >> feval('_paren', magic(5), 3, 3) % M(3,3) ans = 13 >> feval('_brace', num2cell(magic(5)), 3, 3) % C{3,3} ans = 13 

有趣的是, feval似乎比builtin快了3.5%,至less在Matlab 2013b中,这很奇怪,因为feval需要检查函数是否过载,与builtin函数不同:

 >> tic; for i=1:1e6, feval('_paren', magic(5), 3, 3); end; toc; Elapsed time is 49.904117 seconds. >> tic; for i=1:1e6, builtin('_paren', magic(5), 3, 3); end; toc; Elapsed time is 51.485339 seconds.