例如,如果我想读取magic(5)的中间值,我可以这样做:
M = magic(5);
value = M(3,3);
得到value == 13。我希望能够做一些像这样的事情:
value = magic(5)(3,3);
value = (magic(5))(3,3);
省略中间变量。然而,MATLAB抱怨不平衡或意外的圆括号或括号在第一个圆括号在3之前。
是否有可能从数组/矩阵读取值,而不首先分配给一个变量?
例如,如果我想读取magic(5)的中间值,我可以这样做:
M = magic(5);
value = M(3,3);
得到value == 13。我希望能够做一些像这样的事情:
value = magic(5)(3,3);
value = (magic(5))(3,3);
省略中间变量。然而,MATLAB抱怨不平衡或意外的圆括号或括号在第一个圆括号在3之前。
是否有可能从数组/矩阵读取值,而不首先分配给一个变量?
当前回答
实际上,你可以做任何你想做的事情,但是你必须使用索引操作符的函数形式。当您使用()执行索引操作时,实际上是在调用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 for 2-D indexing
value = subindex(magic(5), 3, 3); % Use the function to index the matrix
然而,当所有这些都说了,做了,临时局部变量解决方案是更可读的,这肯定是我的建议。
其他回答
你对使用未记录的特性有什么看法:
>> builtin('_paren', magic(5), 3, 3) %# M(3,3)
ans =
13
或者对于单元格数组:
>> builtin('_brace', num2cell(magic(5)), 3, 3) %# C{3,3}
ans =
13
就像魔法一样:)
更新:
坏消息,上面的破解在R2015b中不再有效!没关系,它是没有文档的功能,我们不能依赖它作为一个受支持的功能:)
对于那些想知道在哪里可以找到这类东西的人,请在fullfile文件夹(matlabroot,'bin','registry')中查找。这里有一堆XML文件列出了各种各样的好东西。请注意,直接调用其中一些函数很容易使MATLAB会话崩溃。
你的初始符号是最简洁的方法:
M = magic(5); %create
value = M(3,3); % extract useful data
clear M; %free memory
如果你在循环中这样做,你可以每次都重新分配M,并忽略clear语句。
如果你创建一个新函数,它会更简单:
function [ element ] = getElem( matrix, index1, index2 )
element = matrix(index1, index2);
end
然后使用它:
value = getElem(magic(5), 3, 3);
实际上,你可以做任何你想做的事情,但是你必须使用索引操作符的函数形式。当您使用()执行索引操作时,实际上是在调用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 for 2-D indexing
value = subindex(magic(5), 3, 3); % Use the function to index the matrix
然而,当所有这些都说了,做了,临时局部变量解决方案是更可读的,这肯定是我的建议。
为了补充Amro的回答,您可以使用feval而不是builtin。实际上没有区别,除非你尝试重载运算符函数:
BUILTIN(…)与FEVAL(…)是相同的,除了它将调用 该函数的原始内置版本,即使是重载版本 存在(为了使其工作,您必须永远不要过载 内装式)。
>> feval('_paren', magic(5), 3, 3) % M(3,3)
ans =
13
>> feval('_brace', num2cell(magic(5)), 3, 3) % C{3,3}
ans =
13
有趣的是,feval似乎只比内置快一点点(约3.5%),至少在Matlab 2013b中是这样,这很奇怪,因为feval需要检查函数是否重载,而不像内置:
>> 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.