2011-10-30 16 views
4

Matlabを初めて使用していて、配列に対して同じ操作を実行するときにループの代わりにドット演算子を使用するほうが速いと言われました。配列内のすべてのクラスインスタンスの呼び出しメソッド(Matlab)

例:

A = 1:200 
A = A .* 10; 

代わりの:

A = 1:200 
for i = 1:200 
    A(i) = A(i) * 10; 
end 

Iオブジェクトの多次元配列(オブジェクトが私が作成したクラスのインスタンスである)作成されています。 forループを使用せずに、すべてのインスタンスで同じ引数を使用して同じメソッドを呼び出すことは可能ですか?

(Aは、3次元配列である)私はこの3つのアプローチを試してみましたが、彼らは動作しません

A(:,:,:).methodName(argument1, argument2); 
A.methodName(argument1, argument2); 
A..methodName(argument1, argument2); 
+1

いいえ、手動でループする必要があります。 arrayfun/cellfunという関数がありますが、これは1行の構文を可能にしますが、(明らかに)フードの下のループでもあり、手動のループよりも遅くなる可能性があります。行列の乗算とメソッドの呼び出しは、2つの非常に異なるものです。 – Mikhail

+0

これらの関数(arrayfun/cellfun)をオブジェクトの配列にも使用できますか? (私の配列が小さいので速度はおそらく問題ではなく、コードの読みやすさを単純化します) –

+1

これはうまくいくはずです: 'arrayfun(@(x)x.methodName(argument1、argument2)、A)' – Mikhail

答えて

4

あなたは

「関数形式」を使用してメソッドを呼び出すことができるはずです
methodName(A, argument1, argument2) 

しかし、 'methodName'は、オブジェクトの配列を渡したという事実を処理する必要があります。可能ならば簡単な例では

classdef Eg 
    properties 
     X 
    end 
    methods 
     function obj = Eg(arg) 
      if nargin == 0 
       % Default-constructor required 
       arg = []; 
      end 
      obj.X = arg; 
     end 
     function x = maxX(objs) 
     % collect all 'X' values: 
      xVals = [objs.X]; 
      % return the max 
      x = max(xVals(:)); 
     end 
    end 
    methods (Static) 
     function testCase() 
     % Just a simple test case to show how this is intended to work. 
      for ii = 10:-1:1 
       myObjArray(ii) = Eg(ii); 
      end 
      disp(maxX(myObjArray)); 
     end 
    end 
end 

だ、それは少数の大規模アレイを記憶するオブジェクトではなく、小さなオブジェクトの多くを持っている(MATLABで)方が良いです。

+1

+ 1オブジェクトの配列の作成を逆に反復する方法(スペースを一度割り当て、動的にそれを増やすことを避ける)が好きです。 – Amro

+0

たとえば、論理インデックスを使用することもできます。 'x = max([objs.X]> 0)'です。 – JaBe

関連する問題