【问题标题】:Iterate over columns in C++ matrix遍历 C++ 矩阵中的列
【发布时间】:2022-01-07 08:55:18
【问题描述】:

我想遍历std::vector<std::vector<int>> 矩阵中的单行和单列并得到它们的总和。

我知道我可以在嵌套循环中执行此操作,但这是我的问题。可以用吗

int val_sum = 0;
std::for_each(matrix_[row].begin(),matrix_[row].end(),[&](int x) {  val_sum += x;});

对于列以及如何做到这一点?

【问题讨论】:

  • 您可以使用嵌套的std::accumulate(或嵌套的std::for_each)。

标签: c++ vector std


【解决方案1】:

您提议的类似方法是迭代矩阵行并累积给定列中的元素。

int val_sum = 0;
std::for_each(matrix.begin(),matrix.end(),[&](std::vector<int> &row) {  val_sum += row[column];});

但我还是更喜欢使用 c++11 range-loop 版本

int val_sum = 0;
for ( const std::vector<int> &row : matrix )
   val_sum += row[column];

【讨论】:

  • 您的循环版本缺少内部循环。
  • 为什么你更喜欢循环版本?
  • @ThomasSablik - 你只需要一个循环,因为你只有一个变量。
  • @Andreimek 因为嵌套版本阅读起来非常清晰且不易出错。
  • 我认为他们意思是他们想以类似于对行求和的方式对列求和。这并不完全清楚,但由于他们已经接受了这个答案,我想它满足了他们的需求
【解决方案2】:

你可以使用嵌套的std::accumulate:

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<std::vector<int>> matrix = { {1, 2, 3}, {2, 3, 4}, {3, 4, 5} };
    const int sum = std::accumulate(matrix.cbegin(), matrix.cend(), 0, [](const auto acc, const auto row) {
        return acc + std::accumulate(row.cbegin(), row.cend(), 0);
    });
    std::cout << sum;
}

【讨论】:

  • 这不是对每个元素求和,而不是对给定列中的每个元素求和吗?
  • @Useless 这就是我理解问题的方式,因为 “我知道我可以在嵌套循环中执行此操作,但这是我的问题。” 我不明白为什么你需要嵌套循环来总结一行或一列。
【解决方案3】:

您可以嵌套两个for_each。您只需要注意外部for_each 的每个元素都将是另一个vector&lt;int&gt;,一行。 [Demo]

#include <algorithm>  // for_each
#include <iostream>  // cout
#include <vector>

int main()
{
    std::vector<std::vector<int>> v{ {1, 2}, {3, 4}, {5, 6} };
    std::for_each(std::cbegin(v), std::cend(v), [](auto& row) {
        std::for_each(std::cbegin(row), std::cend(row), [](auto n) {
            std::cout << n << " ";
        });
        std::cout << "\n";
    });
}

如果你想对矩阵的所有元素求和,你可以使用accumulate 而不是内部的for_each 循环。 [Demo]

#include <algorithm>  // for_each
#include <iostream>  // cout
#include <numeric>  // accumulate
#include <vector>

int main()
{
    int result{};
    std::vector<std::vector<int>> v{ {1, 2}, {3, 4}, {5, 6} };
    std::for_each(std::cbegin(v), std::cend(v), [&result](auto& row) {
        result += std::accumulate(std::cbegin(row), std::cend(row), 0);
    });
    std::cout << "sum = " << result << "\n";
}

甚至有两个嵌套的accumulate[Demo]

#include <iostream>  // cout
#include <numeric>  // accumulate
#include <vector>

int main()
{
    std::vector<std::vector<int>> v{ {1, 2}, {3, 4}, {5, 6} };
    auto result = std::accumulate(std::cbegin(v), std::cend(v), 0, [](auto total, auto& row) {
        return total + std::accumulate(std::cbegin(row), std::cend(row), 0);
    });
    std::cout << "sum = " << result << "\n";
}

如果(毕竟,我从一开始就误解了你,并且)你想添加给定列的所有元素。 [Demo]

#include <iostream>  // cout
#include <numeric>  // accumulate
#include <vector>

int sum_column(const std::vector<std::vector<int>>& v, size_t column)
{
    return std::accumulate(std::cbegin(v), std::cend(v), 0, [&column](auto total, auto& row) {
        return total + row[column];
    });
}

int main()
{
    std::vector<std::vector<int>> v{ {1, 2}, {3, 4}, {5, 6} };
    std::cout << "sum of column 1 = " << sum_column(v, 1) << "\n";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2013-10-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2015-02-28
    • 2016-02-12
    • 2022-01-06
    相关资源
    最近更新 更多