如何将两个压缩矩阵相乘?

时间:2016-01-10 04:52:47

标签: c++ matrix vector compression

目标是将两个任意大小的平方(n×n)矩阵相乘。然而,矩阵被压缩为上三角形,并且忽略矩阵中的零以节省空间。

上三角形表示主对角线下方的所有条目均为零。

例如,3维矩阵可能如下所示:

matrix A and B

这可以解释为这些向量之间的相乘。

multiplication of matrix a and b

我已经开始实施 - 但它变得非常混乱,我想知道是否有一种更简单的方法来实现这一点,同意我的数据格式?

The data:
matrixA = 2d vector that contains the row elements of matrixA
matrixB = 2d vector that contains the col elements of matrixB

The goal:
return matrixC = matrixA * matrixB


vector <int> multiplyVectors(vector <vector<int>>* matrixA, vector <vector<int>>* matrixB)
{
    vector<int> results;
    long int summation = 0;
    int matrixA_size = (*matrixA).size();
    int square = matrixB_size;

    int currentRow = 0; 
    int currentRowInner = 0;
    int currentColumn = 0; 
    int currentColumnInner = 0;

    int doItAmount = 1;
    // multiply each column for every row
    while (currentRow <= matrixB_size)
    {
        for (int i = 0; i < matrixA_size; i++)
        {
            for (int i = 0; i < matrixA_size; i++)
            {

            ...


}}}}

1 个答案:

答案 0 :(得分:1)

两个上三角矩阵的乘积也是上三角矩阵。所以你只需要计算这些术语。每个结果项的产品总和在中心对角线上只有一个产品(这只是被乘对角线的乘积),两个产品用于下一个对角线向上,依此类推到 n 产品单个右上角,您将 n x n 矩阵相乘。

因此,编写外部循环和内部循环以计算正确数量的术语并对结果中的每个术语求和,这是一个简单的问题,以免浪费时间倍增和添加零。对于正常的矩阵乘法,这将显着减少 n 2 n 3 的加法和乘法次数对于上对角矩阵的乘积, n(n-1)/ 2 n(n + 1)(n + 2)/ 6 。对于大型 n ,这会将工作量减少六倍。