目前,我正试图为我正在进行的另一个项目实现矩阵数学。
不过,我不知道这项实施是否有效。有人能告诉我我的实现是否有错误吗?
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
typedef vector<vector<double> > Matrix;
Matrix add(Matrix a, Matrix b)
{
assert(a.size() == b.size() && a[0].size() == b[0].size());
int numRow = a.size(), numCol = a[0].size();
Matrix output(numRow, vector<double>(numCol));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
output[i][j] = a[i][j] + b[i][j];
}
}
return output;
}
Matrix subtract(Matrix a, Matrix b)
{
assert(a.size() == b.size() && a[0].size() == b[0].size());
int numRow = a.size(), numCol = a[0].size();
Matrix output(numRow, vector<double>(numCol));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
output[i][j] = a[i][j] - b[i][j];
}
}
return output;
}
Matrix multiply(Matrix a, double b)
{
int numRow = a.size(), numCol = a[0].size();
Matrix output(numRow, vector<double>(numCol));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
output[i][j] = a[i][j] * b;
}
}
return output;
}
Matrix multiply(Matrix a, Matrix b)
{
assert(a.size() == b.size() && a[0].size() == b[0].size());
int numRow = a.size(), numCol = a[0].size();
Matrix output(numRow, vector<double>(numCol));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
output[i][j] = a[i][j] * b[i][j];
}
}
return output;
}
Matrix dotProduct(Matrix a, Matrix b)
{
assert(a[0].size() == b.size());
int numRow = a.size(), numCol = b[0].size();
Matrix output(numRow, vector<double>(numCol, 0));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
for(unsigned int k = 0; k < a[0].size(); k++)
{
output[i][j] += a[i][k] * b[k][j];
}
}
}
return output;
}
Matrix transpose(Matrix a)
{
int numRow = a[0].size(), numCol = a.size();
Matrix output(numRow, vector<double>(numCol));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
output[i][j] = a[j][i];
}
}
return output;
}
Matrix applyFunc(Matrix a, double (*f)(double))
{
int numRow = a.size(), numCol = a[0].size();
Matrix output(numRow, vector<double>(numCol));
for(int i = 0; i < numRow; i++)
{
for(int j = 0; j < numCol; j++)
{
output[i][j] = (*f)(a[i][j]);
}
}
return output;
}
int main()
{
}发布于 2018-11-26 06:23:38
当然,这是表示Matrix的一种方法。
typedef vector<vector<double> > Matrix;这里的问题是,没有强制执行,这些都是矩形的。您的代码假设它们是矩形,如果假设是错误的,事情就会非常糟糕。
您不使用封装。
Matrix add(Matrix a, Matrix b)
Matrix subtract(Matrix a, Matrix b)
Matrix multiply(Matrix a, double b)
Matrix multiply(Matrix a, Matrix b)
Matrix dotProduct(Matrix a, Matrix b)所有这些都是独立的方法。不是绝对的不-不,但是正确地使用类,您可以强制执行矩形大小的要求(最好是在编译时),但是可以在运行时执行。如果使用这些方法,这些方法通常都是成员函数。
此外,这些功能也是错误的:
Matrix multiply(Matrix a, Matrix b)
Matrix dotProduct(Matrix a, Matrix b)这两种功能都不像它们所宣传的那样。你应该看看维基百科的定义。
https://codereview.stackexchange.com/questions/208428
复制相似问题