例如,如果我想读取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之前。
是否有可能从数组/矩阵读取值,而不首先分配给一个变量?
当前回答
几天前有一篇关于Loren关于Matlab的艺术的很好的博客文章,其中有一些宝石可能会有帮助。特别是,使用helper函数,如:
paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};
哪里可以使用paren()像
paren(magic(5), 3, 3);
将返回
ans = 16
我也会猜测这将比g新手的答案更快,但我没有检查(使用分析器!!)。也就是说,你还必须在某个地方包含这些函数定义。我个人把它们作为独立的函数,因为它们非常有用。
这些函数和其他函数现在可以在函数式编程构造附加组件中使用,该附加组件可以通过MATLAB附加组件资源管理器或文件交换获得。
其他回答
不幸的是,matlab不支持magic(5)(3,3)这样的语法。您需要使用临时中间变量。你可以在使用后释放内存。
tmp = magic(3);
myVar = tmp(3,3);
clear tmp
你对使用未记录的特性有什么看法:
>> 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语句。
注意,如果比较运行时间与标准方式(给结果赋值,然后访问条目),它们是完全相同的。
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没有指针,你必须接受它。
几天前有一篇关于Loren关于Matlab的艺术的很好的博客文章,其中有一些宝石可能会有帮助。特别是,使用helper函数,如:
paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};
哪里可以使用paren()像
paren(magic(5), 3, 3);
将返回
ans = 16
我也会猜测这将比g新手的答案更快,但我没有检查(使用分析器!!)。也就是说,你还必须在某个地方包含这些函数定义。我个人把它们作为独立的函数,因为它们非常有用。
这些函数和其他函数现在可以在函数式编程构造附加组件中使用,该附加组件可以通过MATLAB附加组件资源管理器或文件交换获得。