私はこのfuncition(RotateSlownessTop)を持っており、それが対応する値を計算し、約800回と呼ばれています。しかし、計算が遅く、計算を高速化できる方法があります。
Xにおける要素の数/ Yは、7202(かなり大きいセット)である
Iは、パフォーマンス分析を行なったし、スクリーンショットは、添付されています。
void RotateSlownessTop(vector <double> &XR1, vector <double> &YR1, float theta = 0.0)
{
Matrix2d a;
a(0,0) = cos(theta);
a(0,1) = -sin(theta);
a(1, 0) = sin(theta);
a(1, 1) = cos(theta);
vector <double> XR2(7202), YR2(7202);
for (size_t i = 0; i < X.size(); ++i)
{
XR2[i] = (a(0, 0)*X[i] + a(0, 1)*Y[i]);
YR2[i] = (a(1, 0)*X[i] + a(1, 1)*Y[i]);
}
size_t i = 0;
size_t j = 0;
while (i < YR2.size())
{
if (i > 0)
if ((XR2[i]>0) && (XR2[i-1]<0))
j = i;
if (YR2[i] > (-1e-10) && YR2[i]<0.0)
YR2[i] = 0.0;
if (YR2[i] < (1e-10) && YR2[i]>0.0)
YR2[i] = -YR2[i];
if (YR2[i]<0.0)
{
YR2.erase(YR2.begin() + i);
XR2.erase(XR2.begin() + i);
--i;
}
++i;
}
size_t k = 0;
while (j < YR2.size())
{
YR1[k] = (YR2[j]);
XR1[k] = (XR2[j]);
YR2.erase(YR2.begin() + j);
XR2.erase(XR2.begin() + j);
++k;
}
size_t l = 0;
for (; k < XR1.size(); ++k)
{
XR1[k] = XR2[l];
YR1[k] = YR2[l];
l++;
}
}
EDIT1:私は、これははるかに高速であることをどこかで読ん以来、[]演算子ですべて一back()を置き換えることにより、コードを更新しました。 しかし、プログラム全体はまだ遅いです。どんな提案も感謝しています。
'vector :: reserve'が役立ちます。 – Jarod42
デバッグビルドまたはリリース(最適化ビルド)を実行していますか?デバッグビルドの場合、結果は無意味です。使用したコンパイラの最適化設定を投稿してください。デバッグビルドはSTLコンテナクラスのイテレータチェックのトンに置かれるので、これは特にVisual Studioの場合です。 – PaulMcKenzie
@PaulMcKenzie私はリリース中です。設定は次のとおりです。 最適化:光ファイバを有効にしません(/ Oyオプション) :デフォルト 組み込み関数を有効にします:はい(/大井) 好意サイズやスピード:どちら 省略のフレームポインタの速度(/ O2) 関数のインライン展開を最大化安全な最適化:いいえ 全体プログラムの最適化:はい(/ GL) –