如何编写一个计算标量积的独立函数?

时间:2015-01-05 04:25:12

标签: c++ optimization product scalar

我知道存在一个C ++函数模板(std :: inner_product),但我想尝试编写自己的模板。这是我找到的一些代码,但它在主函数中运行:

#include <iostream>
using namespace std;
int main(){

   float vectorA[3], vectorB[3], scalar=0.0;
   int i;

   // Get input vectors from user.
   cout << "Enter elements of first vector: " << endl;
   for(i=0;i<3;i++)
   {
      cin >> vectorA[i];
   }
   cout << "Enter elements of second vector: " << endl;
   for(i=0;i<3;i++)
   {
      cin >> vectorB[i];
   }

   // Calculate scalar product.
   for(i=0;i<3;i++)
   {
      scalar = scalar + (vectorA[i] * vectorB[i]);
   }

   // Output result.
   cout << "The scalar product is " << scalar << endl;
   return 0;
}

接下来,我想把它写成一个单独的可重用函数,我可以从我的主循环中调用它。这是我能想到的最好的。

float scalarProduct(float a1, float a2, float a3, float b1, float b2, float b3) {

    float vectorA[3], vectorB[3], scalar;
    vectorA[0]=a1;
    vectorA[1]=a2;
    vectorA[2]=a3;
    vectorB[0]=b1;
    vectorB[1]=b2;
    vectorB[2]=b3;

    for(int i=0;i<3;i++)    // Calculate scalar product.
    {
        scalar = scalar + (vectorA[i] * vectorB[i]);
    }
    return scalar;
}

int main() {
    cout << scalarProduct(1,2,3,4,5,6);
}

所以我的问题是:

  1. 如何将数组传递给此函数?必须有一个比六个参数更好的方法,但我无法弄清楚如何。
  2. 当我在Xcode中运行程序时,我收到警告“变量标量在此处使用时可能未被初始化”

    scalar = scalar + (vectorA[i] * vectorB[i]);
    

    该程序仍在运行并计算正确的答案,但我怎样才能使此警告消失?

3 个答案:

答案 0 :(得分:0)

  
      
  1. 如何将数组传递给此函数?必须有比六个参数更好的方法,但我无法弄清楚how.quote
  2.   

要将数组传递到函数中,只需执行以下操作:

float scalarProduct(float arr[6])

main()中,它将如下所示:

float array[6] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
cout << scalarProduct(array);

从那里你可以使用你的数组:

vectorA[0]=arr[0];
vectorA[1]=arr[1];
vectorA[2]=arr[2];
vectorB[0]=arr[3];
vectorB[1]=arr[4];
vectorB[2]=arr[5];
  
      
  1. 当我在Xcode中运行程序时,我收到警告&#39;变量标量在此处使用时可能未被初始化&#39;在
  2. 行   

也许尝试使用初始值初始化标量:

float scalar = 0.0;

答案 1 :(得分:0)

问题

  

如何将数组传递给此函数?必须有一个比六个参数更好的方法,但我无法弄清楚如何。

  1. 更改函数以接受两个数组作为参数。为安全起见,还要传递数组中的元素数。

    float scalarProduct(float a[], float b[], size_t num);
    
  2. 将函数更改为接受两个std:vector作为参数。

    float scalarProduct(std::vector<float> const& a, std::vector<float> const& b);
    
  3. 将函数更改为接受两个std:array作为参数。

    float scalarProduct(std::array<float, 3> const& a, std::array<float, 3> const& b);
    
  4. 在所有这些情况下,您可以使用数组语法访问集合的元素。

    float scalarProduct(std::array<float, 3> const& a, std::array<float, 3> const& b)
    {
       // Initialize scalar to 0
       float scalar = 0.0f;
       for(int i=0;i<3;i++)    // Calculate scalar product.
       {
          scalar = scalar + (a[i] * b[i]);
       }
       return scalar;
    }
    

    如果你使用其他签名但实际上没有太大的不同,那么实现会有所不同。

    问题

      

    当我在Xcode中运行程序时,我收到警告'变量标量在此处使用时可能未被初始化'

    我已经添加了初始化scalar的行。没有它,scalar的初始值是不可预测的。此外,访问未初始化变量的值是导致未定义的行为。

答案 2 :(得分:0)

让你的函数接受对矢量(或Hayden所述的数组)的引用。向量更好,因为您不必硬编码向量的大小。 此外,为此案例设置模板函数很有用。

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
T scalarProduct(const vector<T>& a, const vector<T>& b)
{
    // Check that the size of a and b match here.
    // If not, do what you deem is necessary.

    T product = 0;  // Not initializing variable is cause of your warning.
    for (int i = 0; i < a.size(); i++)
        product += a[i] * b[i];

    return product;
}

int main(void)
{
    // Compile for c++ 11
    // vector<float> a = {1.0, 2.0, 3.0};
    // vector<float> b = {1, 1, 1};

    // Else
    vector<float> a;
    vector<float> b;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    b.push_back(1);
    b.push_back(1);
    b.push_back(1);

    cout << scalarProduct<float>(a, b) << endl;

    return 0;
}