首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩阵运算

矩阵运算
EN

Code Review用户
提问于 2018-11-26 05:22:51
回答 1查看 133关注 0票数 0

目前,我正试图为我正在进行的另一个项目实现矩阵数学。

不过,我不知道这项实施是否有效。有人能告诉我我的实现是否有错误吗?

代码语言:javascript
复制
#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()
{

}
EN

回答 1

Code Review用户

回答已采纳

发布于 2018-11-26 06:23:38

概述

当然,这是表示Matrix的一种方法。

代码语言:javascript
复制
typedef vector<vector<double> > Matrix;

这里的问题是,没有强制执行,这些都是矩形的。您的代码假设它们是矩形,如果假设是错误的,事情就会非常糟糕。

您不使用封装。

代码语言:javascript
复制
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)

所有这些都是独立的方法。不是绝对的不-不,但是正确地使用类,您可以强制执行矩形大小的要求(最好是在编译时),但是可以在运行时执行。如果使用这些方法,这些方法通常都是成员函数。

此外,这些功能也是错误的:

代码语言:javascript
复制
Matrix multiply(Matrix a, Matrix b)
Matrix dotProduct(Matrix a, Matrix b)

这两种功能都不像它们所宣传的那样。你应该看看维基百科的定义。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/208428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档