使用对的矩阵乘法

时间:2010-04-06 04:26:39

标签: c++ data-structures matrix-multiplication

我正在研究进行矩阵乘法的其他方法。我没有将我的矩阵存储为二维数组,而是使用了像

这样的向量
vector<pair<pair<int,int >,int > > 

存储我的矩阵。我的对(对)中的对存储我的索引(i,j),而另一个int存储给定(i,j)对的值。我想我可能会以这种方式实现我的稀疏数组。

问题是当我尝试将此矩阵与其自身相乘时。

如果这是一个二维数组实现,我会将矩阵乘以如下:

   for(i=0; i<row1; i++)
    {
        for(j=0; j<col1; j++)
        {
          C[i][j] = 0;
         for(k=0; k<col2; k++) 
           C[i][j] += A[i][j] * A[j][k];
      }
    }

有人可以指出使用我的'对配对'来实现相同结果的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

到目前为止,您可以在一个位置存储一个值。如果要在矩阵中存储多个非零项,则需要在更大的结构中使用更多对。

map<pair<int, int>, int>将是下一个合乎逻辑的步骤。现在您可以遍历行,因为first的坐标在map的排序顺序中更为重要。

要迭代列,请反转该优先级:

typedef pair<int, int> mx_coord;
struct reverse_compare {
    bool operator() (mx_coord const &l, mx_coord const &r) const
        { return l.second < r.second? true :
                 r.second < l.second? false : l.first < r.first; }
};

typedef map< mx_coord, int > matrix;
typedef map< mx_coord, int, reverse_compare > matrix_transpose;

要将A乘以B,转置B并迭代A和B,将任意不太重要的坐标匹配的元素相乘,因为排序自然会让您逐行逐列。

转置B:

matrix_transpose b_t( b.begin(), b.end() ); // complexity: n log n