C++ 向量矩阵乘法
我在试着乘矩阵。这条线是A[i][j]。布设_backi*j;导致此错误的原因: IntelliSense:表达式必须具有类类型 这个代码怎么了?我还尝试了推回功能C++ 向量矩阵乘法,c++,matrix,C++,Matrix,我在试着乘矩阵。这条线是A[i][j]。布设_backi*j;导致此错误的原因: IntelliSense:表达式必须具有类类型 这个代码怎么了?我还尝试了推回功能 #include "stdafx.h" #include <iostream> #include <vector> using namespace std; using matrix = vector<vector<double>>; matrix multiple(matrix
#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);
}
}
}
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;
}
}
}
或者,您可以使用嵌套的std::数组以及包含维度的模板。这里是一个模板类,因此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);
A[i][j]实际上只是一个双精度数,因此它没有任何名为emplace_back的成员函数。这就是为什么会出现错误的原因。可能您希望将emplace_back与A[i]和B[i]一起使用。另一个逻辑错误是,A和B的大小最初为0,因此即使您设法编译它,您的初始化函数也不会执行任何操作。@AlexFarber,很好的一点,我第一次错过了这一点。我想这是一个很好的例子,说明了为什么人们应该先编译代码,然后把问题和编译器的输出一起发布。那么为什么我可以使用a.size?@Kulis,因为a是一个包含向量的向量。您可以使用matrix=vector;从typedef中看到这一点;。
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);