我如何索引一个函数返回的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.