2

以下のif else関数よりも効率的な解決策についてアイデアを持っている人はいますか?? これにはコードに多くの時間がかかるため、短縮する必要があります。

フル機能は

     function result = vre(t,r,e,n,d)
         if (e==4 && r>0)
        result = 0;
    elseif (e==4 && r==0)
        result = 1;
    elseif (e<4 && r==1)
        result = t;
    elseif (e<4 && r==2)
        result = d;            
    else
        result=n;
    end
end
4

3 に答える 3

5

この関数が処理時間のほとんどを占めている場合、それはほぼ間違いなく呼び出し回数が多すぎるためです。これは、ベクトルまたは行列の各要素に対して個別に呼び出していることが原因である可能性があります。eとの行列入力を受け入れるように関数を変更することをお勧めしrます。これにより、すべてのチェックを一度に実行できます -matlabは行列演算用に構築されているため、これらを利用することは常に良い考えです。

function result = vre(t,r,e,n,d)
#% add error checking for size of input args if desired
result = ones(size(e))*n; #% default result; next assign special cases
result(e==4 & r>0) = 0; #% note the single & for element-wise 'and'
result(e==4 & r==0) = 1;
result(e<4 & r==1) = t;
result(e<4 & r==2) = d;

end

この関数は、入力行列と同じサイズの行列を返すようになりました。単一の要素の場合、現在のバージョンとまったく同じように機能しますが、より高い次元の入力の場合も機能し、おそらく大幅な速度向上が得られます。

于 2013-03-29T03:06:42.440 に答える
4
function result = vre(t,r,e,n,d)
     if (e==4) {
         if(r>0)
             result = 0;
         elseif (r==0)
             result = 1;
     }
     elseif (e<4) {
          if(r==1)
              result = t;
          elseif (r==2)
              result = d; 
     }           
    else
        result=n;
    end
end

このようにすることで、(e==4) と (e<4) を 1 回だけ検証し、不要な検証を回避できます。

処理時間を節約できることを願っています。

PS: MatLab がインストールされていないため、テストされていません。

于 2013-03-29T02:55:08.633 に答える
2

これを試して:

function result = vre(t,r,e,n,d)
  if (e==4)
    result = (r==0);
  elseif (e<4)
    result = (r==1)*t+(r==2)*d;
  else
    result=n;
  end
end

それがより効率的であることを保証することはできません (私は matlab ではなく octave を使用しているため、速度テストは役に立ちません)。しかし、私はそうなると思います。

于 2013-03-29T03:10:55.687 に答える