直接访问结果矩阵中的元素

时间:2012-02-14 23:35:45

标签: matlab

http://www.mathworks.com/matlabcentral/answers/1325-what-is-missing-from-matlab#answer_1931

基本的jist是你不能创建矩阵并直接索引它。

我的问题是有没有一个已知的解决方法来做这样的事情?

我有一堆函数在2x1向量上运行,我使用的是一个匿名函数,它提取第二个元素并对它们进行一些操作。

这样的事情:

f = @(theta)(rot_vec(V1,theta)(2) + rot_vec(V2,theta)(2) - rot_vec(V3,theta)(2));

我如何在matlab中完成相同的操作?

2 个答案:

答案 0 :(得分:2)

首先,没有什么可以阻止你将匿名函数定义为具有临时变量的常规函数​​的指针。

 V1 = 1;
 V2 = 2;
 V3 = 3;
 f = @(theta)(GetRot(theta,V1,V2,V3);

请注意,V1V2V3已被冻结。

 function x = GetRot(theta,V1,V2,V3)
     r1 = rot_vec(V1,theta);
     r2 = rot_vec(V2,theta);
     r3 = rot_vec(V3,theta);
     x = r1(2) + r2(2) + r3(2);
 end

其次,作为一个丑陋的解决方案,您也可以使用subsref,因为它是()运算符的正式名称。

  m = magic(5);

  m(1:5)(1)  %THIS CAUSES AN ERROR!

  %But how about this one?
  subsref(m(1:5),struct('type','()','subs',{{1,2}}))

答案 1 :(得分:0)

一个好的方法就是让你自己的功能去做:

function y=ind(A,i)
  y=A(i)
end

然后你可以这样称呼它:

f = @(theta)(ind(rot_vec(V1,theta),2) + ind(rot_vec(V2,theta),2) - ind(rot_vec(V3,theta),2));

对于更复杂的情况,我自己创建了函数:

function B = ind( A , varargin )
ii=varargin;
idx=find(cellfun(@isempty,ii));
for id=idx
  ii{id}=1:size(A,id);
end
if iscell(A)
  B=A{ii{:}};
else
  B=A(ii{:});
end
end

当你有几个索引时,你可以调用它:

IND(FOO(b)中,1:3,1:51: 您也可以将它与单元格一起使用,然后用[]:

替换1:end

IND(FOO(b)中,1:3,[])