使用向量的矩阵乘法

时间:2014-11-09 08:47:57

标签: c++ matrix

我试图增加矩阵。此行A[i][j].emplace_back(i*j);会导致此错误:

  

IntelliSense:表达式必须具有类类型

这段代码有什么问题?我也尝试了push_back()函数。

#include "stdafx.h"
#include <iostream>
#include <vector>

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

matrix multiple(matrix A, matrix B);
void initialize(matrix& A, matrix& B);


int _tmain(int argc, _TCHAR* argv[])
{
    matrix A;
    matrix B;
    initialize(A, B);
    matrix C = multiple(A, B);
    return 0;
}

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

void initialize(matrix& A, matrix& B)
{
    for (int i = 0; i < A.size(); i++){
        for (int j = 0; j < B.size(); j++){
            A[i][j].emplace_back(i*j);
            B[i][j].emplace_back(i*j);
        }
    }
}

2 个答案:

答案 0 :(得分:4)

A[i][j]实际上只是一个double,所以它没有任何名为emplace_back的成员函数,这就是你得到错误的原因。

因为您已经拥有索引,所以您可以直接放置元素:

void initialize(matrix& A, matrix& B)
{
    for (int i = 0; i < A.size(); i++){
        for (int j = 0; j < B.size(); j++){
            A[i][j] = i*j;
            B[i][j] = i*j;
        }
    }
}

然而,除此之外还有更多内容,此代码将无法编译,因此请始终先尝试编译并发布所有错误。 A和B在传递到初始化时实际上是空的,因此A.size()B.size()都为零,因此实际上不会发生初始化。

这是一个很好的例子,您希望为包含维度数据的矩阵定义自己的数据结构。这样,您就不会遇到尺寸大小丢失时出现的这些问题。

也许有些事情如下:

struct Matrix{
Matrix(unsigned int rows, unsigned int cols):
    m_rows(rows),
    m_cols(cols)
{ 
    for(unsigned int i = 0: i < m_cols; ++i){
        m_data.push_back(vector<double>(m_rows));
    }
}

unsigned int m_rows;
unsigned int m_cols;
vector<vector<double>> m_data;
};

或者,您可以使用嵌套的std::arrays以及包含尺寸的模板。

答案 1 :(得分:2)

这是一个模板类,因此vector可以是int或double

template <class T>
std::vector <std::vector<T>> Multiply(std::vector <std::vector<T>> &a, std::vector <std::vector<T>> &b)
{
    const int n = a.size();     // a rows
    const int m = a[0].size();  // a cols
    const int p = b[0].size();  // b cols

    std::vector <std::vector<T>> c(n, std::vector<T>(p, 0));
    for (auto j = 0; j < p; ++j)
    {
        for (auto k = 0; k < m; ++k)
        {
            for (auto i = 0; i < n; ++i)
            {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return c;
}



std::vector <std::vector<double>> a (2, std::vector<double>(2));
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

std::vector <std::vector<double>> b(2, std::vector<double>(2));
b[0][0] = 5;
b[0][1] = 6;
b[1][0] = 7;
b[1][1] = 8;

auto c = Multiply(a, b);