繁体   English   中英

关于矩阵运算

[英]About matrix operations

这是一个理论问题,没有必要展示代码。

所以,我想知道如何返回和 function 的结果,这将使用指针添加两个 arrays。

  1. 首先,矩阵是否应该在一开始就声明为指针?

  2. 因此,在 function 中,我们将拥有

void sumMatrix (int ** m) (?)

从这里开始,如何继续返回这个和的结果,因为矩阵本身无法返回

选项包括:

  1. 向 function 传递一个指向您希望存储结果矩阵的位置的指针。

  2. 在 function 中编写代码为结果矩阵分配空间并返回指向该空间的指针。

  3. 创建一个结构类型来保存结果矩阵,并让 function 按值返回该结构。

  4. 将结果写入其中一个输入矩阵。

不可能将任何维度的 arrays 传递给 C 中的函数。 甚至无法表达这个概念,因为在大多数情况下,包括函数调用表达式,数组类型的值会自动转换为指针。 因此,

  1. 您的 function 没有其他选择,只能以指针的形式接收其 arguments。

但是,您应该考虑一下具体的指针类型。 C multidimensional arrays (eg int arr[3][4] ) are structured as arrays of arrays, and the aforementioned automatic conversions yield pointers to arrays ( int (*p)[4] ), not pointers to pointers. 另一方面,您可以构造指针的 arrays ( int *arr[3] ) 并使用与多维 arrays 相同的语法来访问它们。 这些到指针的自动转换确实会产生双指针( int **p )。 尽管访问语法匹配,但这些替代方案在 memory 布局和访问效率方面非常不同。

  1. 这取决于。 暂时忽略返回总和的问题,您至少有三个不错的选择:
  • void sumMatrix(int r, int c, int **m1, int **m2); 这适用于指针数组数据布局。 你表达了同样的事情
    void sumMatrix(int r, int c, int *m1[], int *m2[]); ,我可能会倾向于自己这样做。
  • void sumMatrix(int r, int c, int m1[r][c], int m2[r][c]); 这相当于
    void sumMatrix(int r, int c, int m1[][c], int m2[][c]);
    void sumMatrix(int r, int c, int (*m1)[c], int (*m2)[c]); 这些依赖于 C99 中添加到 C 的可变长度数组功能,值得知道的是,此功能在 C11 中成为可选。 它假设紧凑、高效的数组数组数据布局。
  • void sumMatrix(int r, int c, int *m1, int *m2); 或者,等效地,
    void sumMatrix(int r, int c, int m1[], int m2[]); 这假设与前面的数组数据布局相同,但需要您手动执行索引计算( x * c + y )。 如果您想要具有可变数组尺寸的数组布局,而不依赖于 VLA,这将很有用。

就个人而言,我倾向于选择数组数组布局和第二个签名选项的变体之一。

从这里开始,如何继续返回这个和的结果,因为矩阵本身无法返回

您仍然有多个选项,但我倾向于添加第五个参数,其类型与第三个和第四个相同,表示结果矩阵。 因为,同样,它必须是一个指针,所以调用者可以看到由 function 写入指向的 object 的数据。 然后调用者将负责传递指向现有 object 的指针,这很方便,因为它允许(但不要求)使用自动分配的 object。

因此,一种完全的可能性是

void sumMatrix(int r, int c, int m1[r][c], int m2[r][c], int result[r][c]) {
    // ...
}

可以这样调用:

int a[3][4], b[3][4], c[3][4];

// ... fill arrays a and b ...

summMatrix(3, 4, a, b, c);
// the result is in matrix c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM