我如何索引函数返回的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中,您可以使用: