【问题标题】:matrix and vector multiplication矩阵和向量乘法
【发布时间】:2011-09-16 17:42:03
【问题描述】:

假设我们有这样的 3*3 矩阵:

1 3  4
2 6 8
9 0 12

还有一些像这样的向量:

1   2   3 

我的问题是:如何实现它以便我可以乘以另一个?我有示例代码:

#include <cstdlib>
#include <math.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int a[3][3]={{ 2,4,3},{1,5,7},{0,2,3}};
    int b[]={2,5,6};
    int c[3];

    for (int i=0;i<3;i++){
         c[i]=0;
    }

    for (int i=0;i<3;i++){
        for (int j=0;j<3;j++){
            c[i]+=( a[i][j]*b[j]);
        }
    }

    for (int i=0;i<3;i++){
        cout<<a[i]<<"  "<<endl;
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}

我得到的结果是:

0x22ff10
0x22ff1c
0x22ff28

【问题讨论】:

  • 你不能像那样打印数组。您需要编写一个循环来单独打印每个元素。

标签: c++ multidimensional-array


【解决方案1】:

变化:

 for (int i=0;i<3;i++){
      cout<<a[i]<<"  "<<endl;

到:

 for (int i=0;i<3;i++){
      cout<<c[i]<<"  "<<endl;

【讨论】:

    【解决方案2】:

    我认为您想在最后一个循环中打印c[i],而不是a[i]

    【讨论】:

      【解决方案3】:

      设计一个对象?这里有一些伪代码可以帮助您入门:

      // matrix of ints, floats, doubles, whatever numeric type you want
      template<typename T>
      class Matrix
      {
      public:
         Matrix(int rows, int cols)
         {
            // init m_values to appropriate rows and cols
         }
      
         Matrix<T> operator+(const Matrix<T>& rhs)
         {
             // add this matrix to the rhs matrix
         }
      
         Matrix<T> operator*(const Matrix<T>& rhs)
         {
             // verify both matrices have same dimensions (3x3 etc)
             // multiple this matrix by rhs by indexing into m_values
         }
      
         // etc
      
      private:
         // two dimensional dynamic array of type T values
         std::vector<std::vector<T>> m_values; 
      };
      

      您也可以制作非成员模板函数来执行操作。如果你想让它看起来很漂亮,我会创建一个代表 Row 的类,它具有值、相等性、行操作等。然后根据行向量创建一个 Matrix 类。

      【讨论】:

        【解决方案4】:
        #include<iostream>
        #include<math.h>
        using namespace std;
        int main()
        {
            int a[3][3]={{ 1,2,3},{4,5,6},{7,8,9}};
            int b[]={1,2,3};
            int c[3];
        
            for (int i=0;i<3;i++)
            {
                 c[i]=0;
            }
        
            for (int i=0;i<3;i++)
            {
                for (int j=0;j<3;j++)
                {
                    c[i]+=(a[i][j]*b[j]);
                }
            }
        
            for (int i=0;i<3;i++){
                cout<<c[i]<<"  "<<endl;
            }
            system ("pause>0");
        
        }
        

        【讨论】:

        • 尝试在您的代码中添加一些上下文,以帮助未来的读者更好地理解其含义。
        【解决方案5】:

        并行的另一个公式:

         #include <iostream>
         #include<vector>
         #include<ctime>
         #include<omp.h>
        
            using namespace std;
        
        const int matSize = 3;
        int mat[matSize][matSize];
        
        int main()
        {
            clock_t t1, t2;
            double wt1, wt2;
        
            vector<int> vec;
        
            for (int i = 0; i < matSize; i++)
            {
                for (int j = 0; j < matSize; j++)
                {
                    mat[i][j] = i + j;
                }
            }
        
            for (int i = 0; i < matSize; i++)
            {
                vec.push_back(i);
            }
        
            long sum;
            vector<int> res;
        
            t1 = clock();
            wt1 = omp_get_wtime();
            #pragma omp parallel for reduction(+:sum)
            {
                for (int i = 0; i < matSize; i++)
                {
                    sum = 0;
                    for (int j = 0; j < matSize; j++)
                    {
                        sum += mat[i][j] * vec[j];
                    }
                    res.push_back(sum);
                }
            }
            t2 = clock();
            wt2 = omp_get_wtime();
        
        
            cout << "the matrix " << endl;
            for (int i = 0; i < matSize; i++)
            {
                for (int j = 0; j < matSize; j++)
                {
                    cout << mat[i][j] << "  ";
                }
                cout << endl;
            }
        
            cout << endl << "the vector " << endl;
            for (int i = 0; i < vec.size(); i++)
            {
                cout << vec[i] << endl;
            }
        
            cout << endl << "the result " << endl;
            for (int i = 0; i < res.size(); i++)
            {
                cout << res[i] << endl;
            }
        
            cout << "CPU time " << double(t2 - t1) / CLOCKS_PER_SEC << endl;
            cout << "wTime " << wt2 - wt1 << endl;
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-29
          • 1970-01-01
          • 1970-01-01
          • 2016-02-22
          • 1970-01-01
          • 2020-03-16
          • 2020-01-17
          相关资源
          最近更新 更多