18

double_product(vector<double> a, vector<double> b)2 つのベクトルのスカラー積を計算する関数を含むプログラムを作成しようとしています。スカラー積は

$a_{0}b_{0}+a_{1}b_{1}+...+a_{n-1}b_{n-1}$.

これが私が持っているものです。バタバタですががんばります!

#include <iostream>
#include <vector>

using namespace std;

class Scalar_product
{
    public:
    Scalar_product(vector<double> a, vector<double> b);
};
double scalar_product(vector<double> a, vector<double> b)
{
    double product = 0;
    for (int i = 0; i <= a.size()-1; i++)
        for (int i = 0; i <= b.size()-1; i++)
            product = product + (a[i])*(b[i]);
    return product;
}

int main() {
    cout << product << endl;
    return 0;
}
4

5 に答える 5

46

自分でこれを行う必要がない限り (たとえば、それを書くのは宿題です)、既に書かれている標準のアルゴリズムを実際に使用して、まさに必要なことを行う必要があります。

#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<double> a {1, 2, 3};
    std::vector<double> b {4, 5, 6};

    std::cout << "The scalar product is: "
              << std::inner_product(std::begin(a), std::end(a), std::begin(b), 0.0);
    return 0;
}

begin(a)whileとend(a)は C++11 で新しく、std::inner_productC++98 以降で使用できることに注意してください。C++ 98 (または 03) を使用している場合は、独自の等価物を作成して配列を操作するのは非常に簡単beginですend

template <class T, size_t N>
T *begin(T (&array)[N]) {
    return array;
}

template <class T, size_t N>
T *end(T (&array)[N]) {
    return array + N;
}

これらを使用すると、前のコードの C++ 98 バージョンは次のようになります。

int main() {
    double a[] = {1, 2, 3};
    double b[] = {4, 5, 6};

    std::cout << "The scalar product is: "
              << std::inner_product(begin(a), end(a), begin(b), 0.0);
    return 0;
}

begin上記のandendは配列に対してのみ機能することに注意してください。C++11 (およびそれ以降) の and は、 and を定義する通常のコレクション型に対しても機能しますbegin(もちろん、それらを処理するためにオーバーロードを追加するのは簡単ですが)。 :end.begin().end()

template <class Coll>
typename Coll::iterator begin(Coll const& c) { return c.begin(); }

template <class Coll>
typename Coll::iterator end(Coll const& c) { return c.end(); }
于 2012-06-06T04:44:41.233 に答える
12

class定義した を削除できます。あなたはそれを必要としません。

あなたのscalar_product機能では:

double scalar_product(vector<double> a, vector<double> b)
{
    double product = 0;
    for (int i = 0; i <= a.size()-1; i++)
        for (int i = 0; i <= b.size()-1; i++)
            product = product + (a[i])*(b[i]);
    return product;
}

もうすぐです。2 ループは必要ありません。一つだけです。

double scalar_product(vector<double> a, vector<double> b)
{
    if( a.size() != b.size() ) // error check
    {
        puts( "Error a's size not equal to b's size" ) ;
        return -1 ;  // not defined
    }

    // compute
    double product = 0;
    for (int i = 0; i <= a.size()-1; i++)
       product += (a[i])*(b[i]); // += means add to product
    return product;
}

この関数を呼び出すには、 に 2 つのベクトル オブジェクトを作成しmain()、それらに値を入力して (もちろん値の数は同じです!)、 を呼び出す必要があります。scalar_product( first_vector_that_you_create, second_vector_object );

于 2012-06-06T04:22:14.030 に答える
3

うまくいく多くのソリューションが提示されてきましたが、別のバリエーションをスピンアップして、より良いコードを書くのに役立ついくつかの概念を紹介しましょう。

  • classデータを一緒にパックするためにのみ必要です
  • 関数はできるだけ早くその前提条件をチェックする必要があり、それらは文書化する必要があります
  • 関数には事後条件が必要であり、それらは文書化する必要があります
  • コードの再利用は、保守可能なプログラムの基礎です

それを念頭に置いて:

// Takes two vectors of the same size and computes their scalar product
// Returns a positive value
double scalar_product(std::vector<double> const& a, std::vector<double> const& b)
{
    if (a.size() != b.size()) { throw std::runtime_error("different sizes"); }

    return std::inner_product(a.begin(), a.end(), b.begin(), 0.0);
} // scalar_product

アルゴリズムを直接使用することもできますが、inner_productそれに直面しましょう。

  • 2つではなく4つの引数が必要です
  • 引数が同じサイズであるかどうかはチェックしません

だからそれを包む方がいいです。

注:以前const&は、ベクターをコピーしないようにコンパイラーに指示していました。

于 2012-06-06T06:40:51.150 に答える
1

これがあなたが持つべきコードです。コードでクラスを使用しているようですが、ここでは実際には必要ありません。質問でクラスを使用する必要があるかどうか教えてください。

あなたは新しく、このコードはあなたを怖がらせるかもしれません。ですから、これについては、説明しながら説明しようと思います。コード内のコメントを探して、何が行われているかを理解し、理解できない場合は質問してください。

//Scalar.cpp
#include <stdlib.h>
#include <iostream>
#include <vector>

using namespace std;

/**
This function returns the scalar product of two vectors "a" and "b"
*/
double scalar_product(vector<double> a, vector<double> b)
{
    //In C++, you should declare every variable before you use it. So, you declare product and initialize it to 0.
    double product = 0;
    //Here you check whether the two vectors are of equal size. If they are not then the vectors cannot be multiplied for scalar product.
    if(a.size()!=b.size()){
        cout << "Vectors are not of the same size and hence the scalar product cannot be calculated" << endl;
        return -1;  //Note: This -1 is not the answer, but just a number indicating that the product is not possible. Some pair of vectors might actually have a -1, but in that case you will not see the error above.
    }

    //you loop through the vectors. As bobo also pointed you do not need two loops.
    for (int i = 0; i < a.size(); i++)
    {
        product = product + a[i]*b[i];
    }

    //finally you return the product
    return product;
}


 //This is your main function that will be executed before anything else.
int main() {
    //you declare two vectors "veca" and "vecb" of length 2 each
    vector<double> veca(2);
    vector<double> vecb(2);

    //put some random values into the vectors
    veca[0] = 1.5;
    veca[1] = .7;
    vecb[0] = 1.0;
    vecb[1] = .7;

    //This is important! You called the function you just defined above with the two parameters as "veca" and "vecb". I hope this cout is simple!
    cout << scalar_product(veca,vecb) << endl;
}

IDE を使用している場合は、コンパイルして実行するだけです。Unix ベースのシステムで g++ コンパイラを使用してコマンド ラインを使用している場合は、次のようにします (Scalar.cpp はコードを含むファイルです)。

g++ Scalar.cpp -o scalar

実行するには、単に入力します

./scalar

1.99上記のプログラムの出力として取得する必要があります。

于 2012-06-06T04:38:04.847 に答える
0

あなたはベクトル専用のクラスを作りたいようです。私の例で作成したクラスは、3次元ベクトルに合わせて調整されていますが、必要に応じて別のベクトルに変更できます。このクラスはi、j、kを保持しますが、他のMathVectorに基づいて内積を実行することもできます。もう1つのベクトルは、C++参照を介して渡されます。質問が何であったかを推測するのは難しいですが、これは答えになるかもしれないと思います。

#include <iostream>

using namespace std;

class MathVector
{
private:
    double i,j,k;
public:
    MathVector(double i,double j,double k)
    {
        this->i=i;
        this->j=j;
        this->k=k;
    }
    double getI(){return i;}
    double getJ(){return j;}
    double getK(){return k;}
    double scalar(MathVector &other)
    {
        return (i*other.getI())+(j*other.getJ())+(k*other.getK());
    }
};

int main(int argc, char **argv)
{
    MathVector a(1,2,5), b(2,4,1);

    cout << a.scalar(b) << endl;

    return 0;
}
于 2012-06-06T04:28:25.133 に答える