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中完成相同的操作?
答案 0 :(得分:2)
首先,没有什么可以阻止你将匿名函数定义为具有临时变量的常规函数的指针。
V1 = 1;
V2 = 2;
V3 = 3;
f = @(theta)(GetRot(theta,V1,V2,V3);
请注意,V1
,V2
和V3
已被冻结。
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:endIND(FOO(b)中,1:3,[])