运算符 [][] 矩阵 C++
operator [][] matrix c++
我正在尝试创建一个运算符,为我提供某个矩阵的位置 i、j 的值,以及另一个“填充”给定位置的矩阵的值,我尝试放置您可以看到的运算符在 header 但它不起作用,问题可能出在其他地方,但我认为这是主要问题:
int main()
{
matriz a(3,3);
matrizQuad b(3);
for(size_t i=0;i<3;++i)
for(size_t j=0;j<3;++j){
a[i][j]=1;
b[i][j]=2;
}
matriz c=a+b;
cout << "a+b:\n" << c << "\n";
cout << "traco: " << b.traco() << "\n";
return 0;
} ```
Header:
#ifndef MATRIZES_H
#define MATRIZES_H
#include <iostream>
#include <vector>
#include <ostream>
#include <sstream>
using namespace std;
typedef vector<vector<double>> array;
class matriz
{
protected:
int iLargura, iComprimento;
array m;
public:
matriz(int L, int C): iLargura (L), iComprimento (C)
{
array m(L);
for (int i = 0; i<L;i++)
m[i].resize(C);
};
int nL() const {return iLargura;}
int nC() const {return iComprimento;}
vector<double>& operator[] (int i) {return m[i];}
const vector<double>& operator[] (int i) const {return m[i];}
};
class matrizQuad: public matriz
{
public:
matrizQuad (int T): matriz(T,T) {}
double traco();
};
matriz operator+(const matriz& m1, const matriz& m2);
ostream& operator<<(ostream& output, const matriz& m1);
#endif // MATRIZES_H
Body:
#include "matriz.h"
double matrizQuad::traco()
{
double dSoma = 0;
for (int i = 0;i<iLargura; i++)
for (int j = 0;i<iLargura; i++)
if (i==j)
dSoma = dSoma + m[i][j];
return dSoma;
}
matriz operator+(const matriz& m1, const matriz& m2)
{
int C1 = m1.nC();
int L1 = m1.nL();
matriz m(C1,L1);
for (int i = 0;i<C1; i++)
for (int j = 0;i<L1; i++)
m[i][j] = m1[i][j] + m2[i][j];
return m;
}
ostream& operator<<(ostream& output, const matriz& m1)
{
for(int i = 0; i< m1.nL();i++)
{
for (int j=0;j<m1.nC();j++)
output << m1[i][j] << " ";
output << "\n";
}
return output;
}
您的class有一个成员
array m;
此嵌套矢量永远不会调整大小。它的大小为 0
.
在构造函数中声明一个同名的嵌套向量
array m(L);
您在构造函数中调整了其内部向量的大小。对成员内部向量元素的任何后续访问都是越界的。
不要在构造函数中声明另一个同名的嵌套向量,而是调整成员的大小。
请注意,array
对 std::vector<std::vector<double>>
具有误导性。此外,嵌套向量不是高效的二维数据结构。无论如何,还不清楚你的 matriz
做了什么你不能从 std::vector<std::vector<double>>
.
中得到的
按照 463035818_is_not_a_number 的建议修复数组大小调整,使您的矩阵可以正常工作。
matriz(int L, int C): iLargura (L), iComprimento (C)
{
m.resize(L);
for (int i = 0; i<L;i++)
m[i].resize(C);
};
如果您还打印矩阵 a 和 b,您将得到:
a:
1 1 1
1 1 1
1 1 1
b:
2 2 2
2 2 2
2 2 2
a+b:
3 0 0
3 0 0
3 0 0
所以设置和打印矩阵工作得很好。错误在 operator +
:
matriz operator+(const matriz& m1, const matriz& m2)
{
int C1 = m1.nC();
int L1 = m1.nL();
matriz m(C1,L1);
for (int i = 0;i<C1; i++)
for (int j = 0;i<L1; i++)
m[i][j] = m1[i][j] + m2[i][j];
return m;
}
具体来说:
for (int j = 0;i<L1; i++)
我猜你复制并粘贴了 i
的前一个循环,忘记重命名所有变量。
我正在尝试创建一个运算符,为我提供某个矩阵的位置 i、j 的值,以及另一个“填充”给定位置的矩阵的值,我尝试放置您可以看到的运算符在 header 但它不起作用,问题可能出在其他地方,但我认为这是主要问题:
int main()
{
matriz a(3,3);
matrizQuad b(3);
for(size_t i=0;i<3;++i)
for(size_t j=0;j<3;++j){
a[i][j]=1;
b[i][j]=2;
}
matriz c=a+b;
cout << "a+b:\n" << c << "\n";
cout << "traco: " << b.traco() << "\n";
return 0;
} ```
Header:
#ifndef MATRIZES_H
#define MATRIZES_H
#include <iostream>
#include <vector>
#include <ostream>
#include <sstream>
using namespace std;
typedef vector<vector<double>> array;
class matriz
{
protected:
int iLargura, iComprimento;
array m;
public:
matriz(int L, int C): iLargura (L), iComprimento (C)
{
array m(L);
for (int i = 0; i<L;i++)
m[i].resize(C);
};
int nL() const {return iLargura;}
int nC() const {return iComprimento;}
vector<double>& operator[] (int i) {return m[i];}
const vector<double>& operator[] (int i) const {return m[i];}
};
class matrizQuad: public matriz
{
public:
matrizQuad (int T): matriz(T,T) {}
double traco();
};
matriz operator+(const matriz& m1, const matriz& m2);
ostream& operator<<(ostream& output, const matriz& m1);
#endif // MATRIZES_H
Body:
#include "matriz.h"
double matrizQuad::traco()
{
double dSoma = 0;
for (int i = 0;i<iLargura; i++)
for (int j = 0;i<iLargura; i++)
if (i==j)
dSoma = dSoma + m[i][j];
return dSoma;
}
matriz operator+(const matriz& m1, const matriz& m2)
{
int C1 = m1.nC();
int L1 = m1.nL();
matriz m(C1,L1);
for (int i = 0;i<C1; i++)
for (int j = 0;i<L1; i++)
m[i][j] = m1[i][j] + m2[i][j];
return m;
}
ostream& operator<<(ostream& output, const matriz& m1)
{
for(int i = 0; i< m1.nL();i++)
{
for (int j=0;j<m1.nC();j++)
output << m1[i][j] << " ";
output << "\n";
}
return output;
}
您的class有一个成员
array m;
此嵌套矢量永远不会调整大小。它的大小为 0
.
在构造函数中声明一个同名的嵌套向量
array m(L);
您在构造函数中调整了其内部向量的大小。对成员内部向量元素的任何后续访问都是越界的。
不要在构造函数中声明另一个同名的嵌套向量,而是调整成员的大小。
请注意,array
对 std::vector<std::vector<double>>
具有误导性。此外,嵌套向量不是高效的二维数据结构。无论如何,还不清楚你的 matriz
做了什么你不能从 std::vector<std::vector<double>>
.
按照 463035818_is_not_a_number 的建议修复数组大小调整,使您的矩阵可以正常工作。
matriz(int L, int C): iLargura (L), iComprimento (C)
{
m.resize(L);
for (int i = 0; i<L;i++)
m[i].resize(C);
};
如果您还打印矩阵 a 和 b,您将得到:
a:
1 1 1
1 1 1
1 1 1
b:
2 2 2
2 2 2
2 2 2
a+b:
3 0 0
3 0 0
3 0 0
所以设置和打印矩阵工作得很好。错误在 operator +
:
matriz operator+(const matriz& m1, const matriz& m2)
{
int C1 = m1.nC();
int L1 = m1.nL();
matriz m(C1,L1);
for (int i = 0;i<C1; i++)
for (int j = 0;i<L1; i++)
m[i][j] = m1[i][j] + m2[i][j];
return m;
}
具体来说:
for (int j = 0;i<L1; i++)
我猜你复制并粘贴了 i
的前一个循环,忘记重命名所有变量。