我如何索引函数返回的MATLAB数组而不首先将其分配给局部变量?

我如何索引函数返回的MATLAB数组而不首先将其分配给局部变量?,matlab,indexing,matrix,return-value,variable-assignment,Matlab,Indexing,Matrix,Return Value,Variable Assignment,例如,如果我想从magic(5)读取中间值,我可以这样做: M = magic(5); value = M(3,3); 获取值==13。我希望能够做到以下几点: value = magic(5)(3,3); value = (magic(5))(3,3); 省去中间变量。但是,MATLAB抱怨在3之前的第一个括号中有不平衡或意外的括号或括号 不先将数组/矩阵赋值给变量就可以从数组/矩阵中读取值吗?不幸的是,matlab不支持像magic(5)(3,3)这样的语法。您需要使用临时中间变量。你可

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

M = magic(5);
value = M(3,3);
获取
值==13
。我希望能够做到以下几点:

value = magic(5)(3,3);
value = (magic(5))(3,3);
省去中间变量。但是,MATLAB抱怨在
3
之前的第一个括号中有
不平衡或意外的括号或括号


不先将数组/矩阵赋值给变量就可以从数组/矩阵中读取值吗?

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

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

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

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

实际上,可以做你想做的事情,但是你必须使用索引操作符的函数形式。使用
()
执行索引操作时,实际上是在调用函数。所以,即使你不能这样做:

您可以这样做:

丑陋,但有可能

通常,您只需将索引步骤更改为函数调用,这样就不会有两组括号紧跟其后。另一种方法是定义自己的方法来执行订阅索引。例如:

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

然而,当所有这些都说了又做了之后,临时局部变量的解决方案更具可读性,这肯定是我的建议。

实际上可以做你想做的事情,但是你必须使用索引操作符的函数形式。使用
()
执行索引操作时,实际上是在调用函数。所以,即使你不能这样做:

您可以这样做:

丑陋,但有可能

通常,您只需将索引步骤更改为函数调用,这样就不会有两组括号紧跟其后。另一种方法是定义自己的方法来执行订阅索引。例如:

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

然而,当所有这些都说了又做了之后,临时局部变量解决方案更具可读性,这绝对是我的建议。

请注意,如果您将运行时间与标准方法进行比较(先对结果进行签名,然后访问条目),它们是完全相同的

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没有指针,你必须接受它。

请注意,如果你将运行时间与标准方式进行比较(先签名结果,然后访问条目),它们是完全相同的

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没有指针,你必须接受它。

你的初始符号是最简洁的方法:

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

如果在循环中执行此操作,则每次只需重新分配M,同时忽略clear语句

您的初始符号是最简洁的方法:

M = magic(5);  %create
value = M(3,3);  % extract useful data
clear M;  %free memory
如果在循环中执行此操作,则每次只需重新分配M,同时忽略clear语句

就在几天前,有几件珠宝可能会有所帮助。特别是,使用辅助函数,如:

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

paren(magic(5), 3, 3);
会回来吗

ans = 16
我还推测这将比gnovice的答案更快,但我还没有检查(使用分析器!!!)。也就是说,您还必须在某个地方包含这些函数定义。我个人在我的道路上使它们成为独立的功能,因为它们非常有用

这些函数和其他函数现在可以在
函数式编程结构
加载项中使用,该加载项可通过MATLAB加载项资源管理器或在上获得。

几天前刚刚有一些可能有用的gems。特别是,使用辅助函数,如:

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

paren(magic(5), 3, 3);
会回来吗

ans = 16
我还推测这将比gnovice的答案更快,但我还没有检查(使用分析器!!!)。也就是说,您还必须在某个地方包含这些函数定义。我个人在我的道路上使它们成为独立的功能,因为它们非常有用


这些函数和其他函数现在可以在函数式编程结构中找到,该附加模块可通过MATLAB附加模块浏览器或在上找到。

您对使用未记录的功能有何看法:

>> 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会话崩溃。

您对使用未记录的功能有何感受:

>> 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会话崩溃。

如果创建一个新函数,可能会更简单:

function [ element ] = getElem( matrix, index1, index2 )
    element = matrix(index1, index2);
end
然后使用它:

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

如果您创建一个新函数,它可能会更简单:

function [ element ] = getElem( matrix, index1, index2 )
    element = matrix(index1, index2);
end
然后使用它:

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

至少在MATLAB 2013a中,您可以使用: