【问题标题】:Passing to a same function matrices with different sizes of both dimensions传递给两个维度不同大小的相同函数矩阵
【发布时间】:2015-07-12 12:29:34
【问题描述】:

我有几个不同尺寸的常数矩阵,比如说

const int denoise[][3] = {...}。

const int deconv[][4] = {...}

然后我定义了一个类似void handleMatrix(const int* const*){...} 的函数,希望能够处理这些矩阵。但这是不正确的。

我尝试过的一个方法是使用如下模板:

template<typename Ty> void handle Matrix(const Ty m){...}

它在 vs2013 上完美运行。

但是我应该如何在不使用模板的情况下将这些矩阵传递给函数呢?

【问题讨论】:

  • 你为什么不想要一个模板函数?
  • @Shindou 所有矩阵最右边的尺寸都一样吗?
  • @Vlad 来自莫斯科,两种尺寸可能不同
  • @CoffeeandCode 因为我在模板类中定义方法,我想知道是否存在替代方法。
  • 模板的参数和数组有关系吗?

标签: c++ matrix constants


【解决方案1】:

您应该使用typedef,这样您就不必使用任何糟糕的语法:

using matrix_t = int[3][3];

并且您应该尽可能通过引用传递您的参数:

void handle_matrix(const matrix_t &mat){
    // do something with 'mat'
}

如果您想使用不带typedef 的原始语法:

void handle_matrix(const int (&mat)[3][3]){
    // ...
}

如果你想使用原始语法并通过指针传递:

void handle_matrix(const int (*mat)[3]){
    // ...
}

但是你会失去类型安全性,所以我建议不要这样做,只使用最好的选项:typedef 并通过引用传递。


编辑

您在评论@Kerrek SB 的回答时说您的矩阵大小不同。

所以这里是如何处理它并且仍然保持好的方法:

template<size_t Columns, size_t Rows>
using matrix_t = int[Columns][Rows];

template<size_t Columns, size_t Rows>
void handle_matrix(const matrix_t<Columns, Rows> &mat){
    // ...
}

考虑到我假设您可以在我的回答中使用 C++14,如果您留下评论,我可以将其修改为任何其他版本。

【讨论】:

  • @CoffeeandCode 但是我的二维矩阵的两个维度都有不同的大小,我在模板类中定义了这个方法。有没有不用模板的方法我徘徊?
  • 如果你想要类型安全,不。如果您不介意将所有内容都放在堆上,可以。
  • @CoffeeandCode 但是使用模板与为每个矩阵大小定义函数没有区别......
  • @Shindou 与编译器没有什么不同,但它对你来说更容易并且节省了代码重复。您是否试图减小可执行文件的大小?大多数情况下,它的影响微乎其微。
  • 对于数组,我可以定义一个函数foo(const int*)来处理任意大小的数组。为什么二维数组没有类似的方法?
【解决方案2】:

您的矩阵是int[3]s 的数组。如果你想传递 C 风格的参数,你可以传递一个指针,数组的第一个元素加上一个大小:

using Row = int[3];

void foo(const Row * p, std::size_t n_cols)
{
    for (std::size_t i = 0; i != n_cols; ++i)
    {
        for (int n : p[i]) { std::cout << n << ' '; }
        std::cout << '\n';
    }
}

使用示例:

Row * matrix = new Row[40]();
foo(matrix, 40);
delete [] matrix;

使用类型化变量:

Row matrix[] = { {1,2,3}, {2,3,4} };
foo(matrix, std::distance(std::begin(matrix), std::end(matrix)));

【讨论】:

  • 但是我的矩阵在两个维度上都有不同的大小。
  • @Shindou:你的问题不是这么说的!
猜你喜欢
  • 2013-08-17
  • 2012-04-27
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2019-09-23
相关资源
最近更新 更多