Joe*_*ney 350 indexing matlab matrix return-value variable-assignment
例如,如果我想从中读取中间值magic(5)
,我可以这样做:
M = magic(5);
value = M(3,3);
Run Code Online (Sandbox Code Playgroud)
得到value == 13
.我希望能够做到这样的事情之一:
value = magic(5)(3,3);
value = (magic(5))(3,3);
Run Code Online (Sandbox Code Playgroud)
免除中间变量.然而,MATLAB抱怨Unbalanced or unexpected parenthesis or bracket
在第一个括号之前3
.
是否可以在不首先将其分配给变量的情况下从数组/矩阵中读取值?
gno*_*ice 377
它实际上是可以做到你想要什么,但你必须使用索引操作符的功能形式.使用时执行索引操作时()
,实际上是在调用该subsref
函数.所以,即使你不能这样做:
value = magic(5)(3, 3);
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
value = subsref(magic(5), struct('type', '()', 'subs', {{3, 3}}));
Run Code Online (Sandbox Code Playgroud)
丑陋但可能.;)
通常,您只需将索引步骤更改为函数调用,这样就不会有两组括号紧跟在一起.另一种方法是定义您自己的匿名函数来执行下标索引.例如:
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
Run Code Online (Sandbox Code Playgroud)
然而,当一切都说过和做过临时局部变量的解决方法是很多的可读性,而且肯定我的建议.
T. *_*aro 128
只是有好的博客文章对罗兰Matlab的艺术前几天有一对夫妇的宝石,这可能有助于.特别是,使用辅助函数,如:
paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};
Run Code Online (Sandbox Code Playgroud)
在哪里paren()
可以使用像
paren(magic(5), 3, 3);
Run Code Online (Sandbox Code Playgroud)
会回来的
ans = 16
Run Code Online (Sandbox Code Playgroud)
我也猜测这会比gnovice的答案更快,但我没有检查过(使用探查器!!!).话虽这么说,你还必须在某处包含这些函数定义.我个人在我的道路上使它们成为独立的功能,因为它们非常有用.
这些函数和其他函数现在可以在Functional Programming Constructs附件中找到,该附加组件可通过MATLAB Add-On Explorer或File Exchange获得.
Amr*_*mro 75
您对使用未记录的功能感觉如何:
>> builtin('_paren', magic(5), 3, 3) %# M(3,3)
ans =
13
Run Code Online (Sandbox Code Playgroud)
或者用于单元格数组:
>> builtin('_brace', num2cell(magic(5)), 3, 3) %# C{3,3}
ans =
13
Run Code Online (Sandbox Code Playgroud)
就像魔术:)
坏消息,上面的黑客在R2015b中不再起作用了!没关系,它是未记录的功能,我们不能依赖它作为支持的功能:)
对于那些想知道在哪里找到这类东西的人,请查看文件夹fullfile(matlabroot,'bin','registry')
.那里有一堆XML文件列出了各种各样的好东西.请注意,直接调用其中一些函数很容易导致MATLAB会话崩溃.
小智 53
至少在MATLAB 2013a中你可以使用getfield
如下:
a=rand(5);
getfield(a,{1,2}) % etc
Run Code Online (Sandbox Code Playgroud)
得到元素(1,2)
sec*_*ond 15
遗憾的magic(5)(3,3)
是,matlab不支持语法.你需要使用临时中间变量.你可以在使用后释放内存,例如
tmp = magic(3);
myVar = tmp(3,3);
clear tmp
Run Code Online (Sandbox Code Playgroud)
tit*_*tus 12
请注意,如果您将运行时间与标准方式进行比较(将结果作为对象,然后访问条目),则它们完全相同.
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
Run Code Online (Sandbox Code Playgroud)
我认为,底线是:MATLAB没有指针,你必须忍受它.
如果你创建一个新函数可能会更简单:
function [ element ] = getElem( matrix, index1, index2 )
element = matrix(index1, index2);
end
Run Code Online (Sandbox Code Playgroud)
然后使用它:
value = getElem(magic(5), 3, 3);
Run Code Online (Sandbox Code Playgroud)