2011-03-11 8 views
1

私はこのコードを使用していますが、扱いにくいものです。これは、セル配列である1つの引数を持ち、各セルにはdoubleのベクトルがあります。すべてのベクトルは同じサイズです。この変数の関数の出力で関数を呼び出す必要があります。たとえば、ここではdoubleベクトルのすべてのメンバーに対してlog()を呼び出し、sum()を呼び出してすべてを合計します。実際のコードでは、セルの数がはるかに多くなります。ループを使用せずにこれを単純化する方法はありますか?ありがとう!doubleのセル配列上の関数の出力で関数を呼び出すMATLABコードを単純化するにはどうすればよいですか?

>> cell_of_double{:} 

ans = 

    0.3140 
    0.7160 
    0.6925 
    0.4265 
    0.8875 
    0.5785 
    0.7185 
    0.3275 
    0.3030 
    0.5745 
    0.7435 
    0.6930 
    0.7290 
    0.5660 
    0.2750 


ans = 

    0.3620 
    0.3580 
    0.4760 
    0.5560 
    0.3245 
    0.3785 
    0.8805 
    0.7600 
    0.7580 
    0.5435 
    0.4985 
    0.5830 
    0.6155 
    0.8010 
    0.6150 

>> cell_of_double 

cell_of_double = 

    [15x1 double] 
    [15x1 double] 

>> sum(cellfun(@sum, cellfun(@(x) sum(arrayfun(@log, x)), cell_of_double(:), 'UniformOutput', false))) 

ans = 

    -18.6004 

答えて

4

セル内のベクトルはすべて同じサイズなので、マトリックス/ベクトルに折り畳むことができます。各セルで操作を実行する方法は、スーパーベクトルで行う方法と同じです。代わりcellfunの `dummyVector`は、(セルアレイは、1×2または2×1であるか否かに応じて)列ベクトル*又は*行列とすることができるのでので、あなたは、

dummyVector=cell2mat(cell_of_double); 
output=sum(log(dummyVector)); 
+2

を行うことができ[コロン演算子](http://www.mathworks.com/help/techdoc/ref/colon.html)を使用して、それを列ベクトルに再構成する必要があります。 'output = sum(log(dummyVector(:) )); ' – gnovice

+0

あなたのおかげで! –

関連する問題