【问题标题】:Directly accessing element in result matrix [duplicate]直接访问结果矩阵中的元素[重复]
【发布时间】:2012-03-06 08:24:49
【问题描述】:

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

基本要点是您不能创建矩阵并直接对其进行索引。

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

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

类似这样的:

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

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

     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}}))
    

    【讨论】:

      【解决方案2】:

      一个好的解决方法是让你自己的函数来做到这一点:

      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,[])

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多