矩阵标量积

时间:2017-05-22 12:41:54

标签: c++

我有计算标量积的任务

s=(B*(r+q+r), A*A*p) 

据我所知,我需要计算2个向量:第一个 - B *(r + q + r),第二个 - A p,然后计算标量积。

#include <iostream>
#include <vector>

using namespace std;
using matrix = vector<vector<double>>;

matrix add(matrix A, matrix B) {
    matrix C;
    C.resize(A.size());
    for (int i = 0; i< A.size(); i++) {
        C[i].resize(B.size());
        for (int j = 0; j < B.size(); j++) {
            C[i][j] = A[i][j] + B[i][j];
        }
    }
    return C;
}

matrix multiple(matrix A, matrix B)
{
    matrix C;
    C.reserve(100);
    C.resize(B.size());
    for (int i = 0; i < A.size(); i++) {
        C[i].resize(B.size());
        for (int j = 0; j < B.size(); j++) {
            for (int k = 0; k < B.size(); k++)
                C[i][j] += A[i][k] * B[k][j];
        }
    }
    return C;
}

void main() {
    matrix A = { {1,2,3}, {1,2,1}, {3,2,0} };
    matrix B = { {4,1,2},{0,4,3},{1,1,1} };
    matrix r = { {-0.7f, 1.3, 0.2} };
    matrix q = { { -1.6f, 0.8, 1.1} };
    matrix p = { {0.1, 1.7, -1.5} };


    matrix r_q = add(r, q);

    for (int i = 0; i < r_q.size(); i++) {
        for (int j = 0; j < r_q.size(); j++) {
            cout << r_q[i][j] << "\t";
        }
        cout << "\n";
    }

    matrix a_a = multiple(A, A);
    matrix a_a_p = multiple(a_a,p);

    getchar();
}

问题:

  1. 添加方法工作不正确,它只输入一个数字 - 第一项的总和。
  2. 具有相同尺寸(A * A)的倍增矩阵工作正确。具有不同维度的乘法矩阵(a_a * p) - 返回错误&#34;向量下标超出范围&#34;。
  3. 感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

OP选择使用std::vector<std::vector<double>>实现两个矩阵向量。

这一般可能不是一个好的设计选择,但也特别是为了与所有相关操作的数学含义保持一致,所有的矢量都应该被视为(并声明)为“列”矩阵(或Nx1矩阵):

matrix r = { {-0.7}, {1.3}, {0.2} };
matrix q = { {-1.6}, {0.8}, {1.1} };
matrix p = { {0.1}, {1.7}, {-1.5} };

然后,在执行计算的函数中,应特别注意行和列的正确大小,以避免越界访问。

matrix add(matrix const &A, matrix const &B)
{
    if (A.size() != B.size()  ||  A.size() == 0)
        throw std::runtime_error("number of rows mismatch");

    size_t columns = A[0].size();
    matrix C(A.size(), std::vector<double>(columns, 0.0));

    for (size_t i = 0; i < A.size(); i++)
    {
        if ( A[i].size() != columns  ||  B[i].size() != columns )
            throw std::runtime_error("number of columns mismatch");
        for (size_t j = 0; j < columns; j++)
        {
            C[i][j] = A[i][j] + B[i][j];
        }
    }
    return C;
}

matrix multiple(matrix const &A, matrix const &B)
{
    if ( A.size() == 0  ||  B.size() == 0  ||  B[0].size() == 0)
        throw std::runtime_error("size mismatch");

    size_t columns = B[0].size();
    matrix C(A.size(), std::vector<double>(columns, 0.0));

    for (size_t i = 0; i < A.size(); i++)
    {
        if ( A[i].size() != B.size()  ||  B[i].size() != columns )
            throw std::runtime_error("inner size mismatch");

        for (size_t j = 0; j < columns; j++)
        {
            for (size_t k = 0; k < B.size(); k++)
                C[i][j] += A[i][k] * B[k][j];
        }
    }
    return C;
}

编译器也应警告OP关于void main而不是int main的错误使用以及有符号和无符号整数表达式之间的比较(我使用size_t代替{{ 1}})。

从数学的角度来看,值得注意的是解决OP问题,即计算标量乘积 s =( B r < / strong> + q + r ), AAp ),真正需要(要实施)的操作是向量的总和,产品通过向量的矩阵(比矩阵乘法更容易和更有效)和两个向量的点积:

t = r + q + r

b = Bt

= Ap

a = Au

s =( b a