0

1) QVector のポインタを関数に渡してから、それを処理したいと考えています。私はこれを試しました:

void MainWindow::createLinearVector(QVector<float> *vector, float min, float max )
{
    float elementDiff=(max-min)/(vector->size()-1);

    if(max>min) min -= elementDiff;
    else        min += elementDiff;

    for(int i=0; i< vector->size()+1 ; i++ )
    {
        min += elementDiff;
        *(vector+i) = min; //Problematic line
    }

}

ただし、コンパイラは 、行の「演算子 = に一致しません」*(vector+i) = min;と表示します。QVector でこのようなアクションを実行する最良の方法は何でしょうか?

2) 関数は、たとえば vector(a:b:c) のように、matlab : 演算子が機能する方法で、プロットのベクトルに値を線形に分配することになっています。Qtでそのようなことを実行する最も簡単で最良の方法は何ですか?

編集:

ここからの助けを借りて、最初の問題は解決されます。:)

メソッド自体も改善しました。上記のような複数の加算の代わりに線形補間を使用することで、精度を大幅に向上させることができます。多重加算では誤差が蓄積されますが、これは線形補間によって大部分除去されます。

ちなみに最初の関数のif文は不要だったので、倍加法でもちょっと手を加えるだけで消すことができました。

void MainWindow::createLinearVector(QVector<double> &vector, double min, double max )
{
    double range = max-min;
    double n =   vector.size();

    vector[0]=min;

    for(int i=1; i< n ; i++ )
    {
        vector[i] = min+ i/(n-1)*range;
    }
}

これにはエンチャントされたループを使用することを検討しましたが、より実用的でしょうか? たとえば、 foreach ループでは、補間のためにいくつかの変数をインクリメントする必要がありますか? また、最初の要素をスキップするための条件を作成しますか?

4

3 に答える 3

5

QVector の特定の場所に float を配置したいと考えています。

次に、これを使用します。

(*vector)[i] = min; //Problematic line

ベクターは QVector へのポインターであり、*vectorQVector と同様にインデックスを付けることができる QVector になり[i]ます。ただし、優先順位のため、操作の順序を正しくするには括弧が必要です。

于 2014-01-05T23:02:55.560 に答える
1

そうですね、ここで QVector ポインターを使用してもあまり意味がありません。その理由は次のとおりです。

  • 暗黙の共有が十分に高速でない場合は、メソッド パラメーターの参照を使用する方が C++ 風になります。

  • ただし、ほとんどの場合、同じ引数 (つまり、出力引数) で結果を返さずに引数を渡すだけの場合は、参照さえ必要ありません。これは、*QVector が暗黙的に共有され、コピーはドキュメントに従って書き込みに対してのみ発生するためです。幸いなことに、どちらの場合もメソッドの呼び出しと内部実装の構文は同じであるため、簡単に変更できます。

  • 生のポインターではなくスマート ポインターを使用することをお勧めしますが、私の意見では、どちらも不必要に複雑なソリューションです。

したがって、コードを次のようにリファクタリングすることをお勧めします。

void MainWindow::createLinearVector(QVector<float> &vector, float min, float max)
{
    float elementDiff = (max-min) / (vector.size()-1);

    min += ((max>min) ? (-elementDiff) : elementDiff)

    foreach (float f, vector) {
        min += elementDiff;
        f = min;
    }
}

コードで次のことを修正したことに注意してください。

  • ポインターではなく参照型パラメーター

  • "->" メンバーの解決を "." にします。それぞれ

  • この場合、不自然な if/else の代わりに三項演算

  • 低レベルのインデックス作成の代わりに Qt の foreach を使用すると、元のポイントが意味をなさなくなります

これは、呼び出し元からメソッドを呼び出す方法です。

createLinearVector(vector, fmin, fmax);
于 2014-01-06T01:09:54.123 に答える
1

私は、最初に、このようなものに Mutable イテレータを使用する必要があると思います: Qt doc リンク

このようなもの:

QMutableVectorIterator<float> i(vector);
i.toBack();
while (i.hasPrevious())
    qDebug() << i.{your code}
于 2014-01-05T22:11:19.617 に答える