二维矢量矩阵加法

时间:2016-10-30 20:43:42

标签: c++

vector<vector<int>> AsumB(
    int kolumny, vector<vector<int>> matrix1, vector<vector<int>> matrix2) {
    vector<vector<int>>matrix(kolumny);
    matrix = vector<vector<int>>(matrix1.size());
    for (int i = 0; i < kolumny; ++i)
        for (int j = 0; i <(static_cast<signed int>(matrix1.size())); ++i)
            matrix[i][j] = matrix1[i][j] + matrix2[i][j];

     return matrix;
}

请告诉我我不理解并帮助我解决这个问题 因为对于1维向量,这种描述会起作用;

2 个答案:

答案 0 :(得分:0)

怎么样?
vector<vector<int>> AsumB(vector<vector<int>> const & matrix1,
                          vector<vector<int>> const & matrix2) {
    vector<vector<int>> matrix(matrix1);
    for (std::size_t i = 0U; i < matrix.size(); ++i)
        for (std::size_t j = 0U; j < matrix[j].size(); ++j)
            matrix[i][j] += matrix2[i][j];

    return matrix;
}

答案 1 :(得分:0)

无法重现,并且OP报告的编译器错误看起来与代码不匹配,因此问题可能在其他地方。

然而,这里存在很多错误,可能导致各种应该解决的问题。我已经冒昧地重新格式化代码以使解释更容易

vector<vector<int>> AsumB(int kolumny,
                          vector<vector<int>> matrix1,
                          vector<vector<int>> matrix2)

matrix1matrix2按值传递。逻辑上没有任何错误,但这意味着除非编译器非常清晰,否则可能会进行大量不必要的复制。

{
    vector<vector<int>> matrix(kolumny);

声明vector vectorvector的外部kolumny大小为vector。没有分配内部 matrix = vector<vector<int>>(matrix1.size()); ,因此2D操作注定失败。

vector

制作一个vector vector个临时matrix1,其外部matrix的大小与matrix的外部向量相匹配。然后将该临时向量分配给刚刚创建的 for (int i = 0; i < kolumny; ++i) for (int j = 0; i < (static_cast<signed int>(matrix1.size())); ++i) ,替换它的当前内容,然后销毁。 i仍然没有分配内部向量,因此2D操作仍然注定失败。

j

static_castfor永远不应该是负数(如果它们存在巨大的逻辑问题),那么使用无符号类型。使用正确的无符号类型,i毫无意义。

此外,内部j循环会增加并测试 matrix[i][j] = matrix1[i][j] + matrix2[i][j]; ,而非matrix

j

除了 return matrix; } 没有vector<vector<int>> AsumB(const vector<vector<int>> & matrix1, const vector<vector<int>> & matrix2) 索引之外,我认为没有错。这将导致Undefined Behaviour访问超出范围。

vector<vector<int>>

清理它以使其在逻辑上合理:

vector

我们不需要列数。矢量已经知道所涉及的所有尺寸。但需要注意的是:const允许所有内部{ size_t row = matrix1.size(); 的不同大小。不要这样做,你应该做得很好。

接下来,此函数现在通过常量引用获取参数。使用引用时,不会复制。使用size_t,编译器知道不会更改向量的内容,并且可以防止错误并进行一系列优化。

    if (!(row > 0 && row == matrix2.size()))
    {
        return  vector<vector<int>>();
    }

vector是一种无符号数据类型,保证足够大,可以索引任何可表示的对象。这将是足够的,你不必担心讨厌的否定数字。同时也不需要任何铸造。

    size_t column = matrix1[0].size();
    if (!(column > 0 && column == matrix2[0].size()))
    {
        return  vector<vector<int>>();
    }

在这里,我们确保每个人都同意他们的行数,如果他们没有,则返回空 vector<vector<int>> matrix(row, vector<int>(column)); 。你也可以抛出异常。例外可能是更好的解决方案,但我不知道用例。

vector<int>(column)

与上述相同,但确保列数有意义。

row

按列矩阵创建本地行以存储结果。注意第二个参数。 vector告诉编译器,所有column内部向量都将初始化为 for (int i = 0; i < row; ++i) { for (int j = 0; j < column; ++j) { 大小为 matrix[i][j] = matrix1[i][j] + matrix2[i][j]; } } return matrix;

vector<vector<int>> AsumB(const vector<vector<int>> & matrix1,
                          const vector<vector<int>> & matrix2)
{
    size_t row = matrix1.size();
    if (!(row > 0 && row == matrix2.size()))
    {
        return  vector<vector<int>>();
    }
    size_t column = matrix1[0].size();
    if (!(column > 0 && column == matrix2[0].size()))
    {
        return  vector<vector<int>>();
    }
    vector<vector<int>> matrix(row, vector<int>(column));

    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < column; ++j)
        {
            matrix[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    return matrix;
}

这里我们简化了循环,因为我们知道所有尺寸。

class Example extends React.Component {
  constructor() {
    super();
    this.state = { user: {} };
    this.onSubmit = this.handleSubmit.bind(this);
  }
  handleSubmit(e) {
    e.preventDefault();
    var self = this;
    fetch('http://reqres.in/api/users', { 
        method: 'POST',
        data: {
          name: self.refs.name,
          job: self.refs.job
        }
      })
      .then(function(response) {
        return response.json()
      }).then(function(body) {
        console.log(body);
      });
  }
  render() {
    return (
      <form onSubmit={this.onSubmit}>
        <input type="text" placeholder="Name" ref="name"/>
        <input type="text" placeholder="Job" ref="job"/>
        <input type="submit" />
      </form>
    );
  }
}

ReactDOM.render(<Example/>, document.getElementById('View'));

编译器有许多技巧可以在返回时消除复制矩阵。如果您想了解更多信息,请使用您首选的网络搜索引擎查找返回值优化。     }

所有在一起:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react-dom.min.js"></script>
<div id="View"></div>