Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将计算矩阵转置的函数的结果传递给打印矩阵的另一个函数?_C++_Pointers_Matrix_Parameter Passing_Transpose - Fatal编程技术网

C++ 如何将计算矩阵转置的函数的结果传递给打印矩阵的另一个函数?

C++ 如何将计算矩阵转置的函数的结果传递给打印矩阵的另一个函数?,c++,pointers,matrix,parameter-passing,transpose,C++,Pointers,Matrix,Parameter Passing,Transpose,我创建了两个函数,一个用于查找函数的转置,另一个用于打印函数。我知道printMatrix函数很好用。 但是,我不知道如何使用函数转置矩阵,然后打印它 int main() { //Constants int givenMatrix[3][3]; //Takes in the given values of the matrix cout << "Please input matrix values in the order described " <<

我创建了两个函数,一个用于查找函数的转置,另一个用于打印函数。我知道printMatrix函数很好用。 但是,我不知道如何使用函数转置矩阵,然后打印它

int main()
{
  //Constants
  int givenMatrix[3][3];

  //Takes in the given values of the matrix
  cout << "Please input matrix values in the order described " <<endl;
  for (int i=0; i < 3; ++i){
    cout << "Eneter Three Elements for Row: " << i + 1 << endl;
    for (int j=0; j < 3; ++j){
      cin >> givenMatrix[i][j];
    }
  }

printMatrix(givenMatrix);
int p = indexTranspose(givenMatrix);
printMatrix(p);
//pointerTranspose(givenMatrix);

return 0;
}
intmain()
{
//常数
int givenMatrix[3][3];
//接受矩阵的给定值

cout首先,我将解释原始函数不起作用的原因。在indexTranspose中创建的数组是一个局部变量,这意味着它不存在于函数之外。因此,当
indexTranspose
完成后,程序返回到
main
,转置就消失了

您尝试使用指针的路径是正确的,但没有完全正确

您需要让pointerTranspose接受指向3x3矩阵的指针。看起来您在创建givenMatrix之后试图将其设置为指针,但您不能这样做。以下是一个pointerTranspose示例:

//Function to find the transpose using indices
void pointerTranspose(int (*givenMatrix)[3][3])
{
    int transpose[3][3];
    //Find the transpose of the matrix
    for (int i=0; i < 3; i++){
        for (int j=0; j < 3; j++){
            transpose[i][j] = (*givenMatrix)[j][i];
        }
    }

    //Set the values in the original matrix
    for (int i=0; i < 3; i++){
        for (int j=0; j < 3; j++){
            (*givenMatrix)[i][j] = transpose[i][j];
        }
    }
}
//使用索引查找转置的函数
无效指针传输(int(*givenMatrix)[3][3])
{
int转置[3][3];
//求矩阵的转置
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
转置[i][j]=(*givenMatrix)[j][i];
}
}
//在原始矩阵中设置值
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
(*givenMatrix)[i][j]=转置[i][j];
}
}
}
然后您可以这样称呼它:
pointerTranspose(&givenMatrix);

您也可以通过将
(*givenMatrix)[j][i]
直接分配给
(*givenMatrix)[i][j]
)而不在
指针transpose
中创建临时
转置
变量,但我将此作为练习留给您。(提示:小心不要交换东西两次!)

但是,我不知道如何使用 printMatrix函数

该语句中包含了一些内容,但您似乎在问“我如何将
转置
函数作为参数传递给
printMatrix
函数,以便
printMatrix
函数打印矩阵的转置?”(或将根据我传递的函数打印矩阵的任何其他变化)

本质上,如果这就是你所追求的,你只是想传递一个函数,这个函数将以某种方式操作你的矩阵作为一个参数,然后让打印函数应用这个函数,然后打印结果。本质上,这与创建转置矩阵,然后将转置矩阵作为单个argu传递是一样的修改为
printMatrix
,但通过在打印矩阵之前包含另一个对矩阵有作用的参数来更改
printMatrix
的行为,这是有好处的

无论您是首先创建转置并传递它,还是传递原始矩阵和转置函数,您都需要第二个矩阵来保存原始矩阵的转置,以便可以打印其值。关键区别在于转置矩阵需要在什么范围内可见。从
索引的角度来看转置
功能无所谓。您有两个选项(1)保留返回类型
void
,并传入第二个矩阵,以填充原始矩阵的转置,或(2)您可以更改
indexTranspose
函数的返回类型,并动态分配矩阵以保存转置并返回指向转置的指针

注意:作为两者的扩展,您可以传递对现有矩阵的引用,或声明并返回STL容器,但这些将留待以后使用基本类型的2D数组
int

最简单的方法是简单地传入另一个3x3 2D数组以保存转置值。您只需向
indexTranspose
函数添加另一个参数即可完成此操作,例如

 /* Function to find the transpose using indices */     
void indexTranspose (int (*transpose)[3], int (*givenMatrix)[3])
{
    //Find the transpose of the matrix
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            transpose[i][j] = givenMatrix[j][i];
        }
    }
}
(一个函数指针
f
,返回类型为
void
,将指向
int
[3]数组的两个指针作为其参数,例如两个3x3 2D数组)

因此,将函数指针作为参数添加到
printMatrix
函数可能是:

void printMatrix (int (*m)[3], void (*f)(int (*)[3], int (*)[3]))
{
    int altered[3][3] = {{0}};

    f (altered, m);  /* apply function to original m, with results in altered */

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            std::cout << " " << std::setw(3) << altered[i][j];
        std::cout.put ('\n');
    }
}
实际上,您只需将修改后的矩阵作为矩阵参数传递给
printMatrix
,因为您可能会将该矩阵用于打印以外的用途,但学习如何传递函数以提供操作也是完全合法的(将来您可能会将该函数传递给打印函数以外的其他函数)

综上所述,你可以做类似的事情:

#include <iostream>
#include <iomanip>

/* Function to find the transpose using indices */     
void indexTranspose (int (*transpose)[3], int (*givenMatrix)[3])
{
    //Find the transpose of the matrix
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            transpose[i][j] = givenMatrix[j][i];
        }
    }
}

void printMatrix (int (*m)[3], void (*f)(int (*)[3], int (*)[3]))
{
    int altered[3][3] = {{0}};

    f (altered, m);

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            std::cout << " " << std::setw(3) << altered[i][j];
        std::cout.put ('\n');
    }
}

int main (void) {

    int givenMatrix[3][3];

    std::cout << "Please input matrix values in the order described " << '\n';
    for (int i = 0; i < 3; i++) {
        std::cout << "Eneter Three Elements for Row: " << i + 1 << '\n';
        for (int j=0; j < 3; ++j){
            if (!(std::cin >> givenMatrix[i][j])) {  /* always VALIDATE input */
                std::cerr << "error: invalid integer input.\n";
                return 1;
            }
        }
    }
    /* pass given & pointer to function */
    printMatrix (givenMatrix, indexTranspose); 
}

如果您有任何关于将函数指针作为参数传递的问题,或者如果我误解了您的问题,请告诉我,我很乐意提供进一步帮助。

如果这是家庭作业问题,我建议您向老师寻求帮助,因为您的问题中有几个部分表明您有错误sunderstood谈到了一些话题。不知道你从哪里来,我很难很好地纠正这些误解。谢谢你的帮助,这确实是一个家庭作业。遗憾的是,我不能安排他的办公时间。教授要求创建一个3x3矩阵,通过主键盘读取。然后创建一个空的printMa调用时将打印任何矩阵的trix()函数,以及一个void transpossematrix()函数函数输出新的转置矩阵。非常感谢!!我将尝试你的练习,但是你能澄清为什么我需要//在原始矩阵部分设置值吗?出于同样的原因,你原来的
indexTranspose
函数不起作用。行
void (*f)(int (*)[3], int (*)[3]);
void printMatrix (int (*m)[3], void (*f)(int (*)[3], int (*)[3]))
{
    int altered[3][3] = {{0}};

    f (altered, m);  /* apply function to original m, with results in altered */

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            std::cout << " " << std::setw(3) << altered[i][j];
        std::cout.put ('\n');
    }
}
    printMatrix (givenMatrix, indexTranspose);
#include <iostream>
#include <iomanip>

/* Function to find the transpose using indices */     
void indexTranspose (int (*transpose)[3], int (*givenMatrix)[3])
{
    //Find the transpose of the matrix
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            transpose[i][j] = givenMatrix[j][i];
        }
    }
}

void printMatrix (int (*m)[3], void (*f)(int (*)[3], int (*)[3]))
{
    int altered[3][3] = {{0}};

    f (altered, m);

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            std::cout << " " << std::setw(3) << altered[i][j];
        std::cout.put ('\n');
    }
}

int main (void) {

    int givenMatrix[3][3];

    std::cout << "Please input matrix values in the order described " << '\n';
    for (int i = 0; i < 3; i++) {
        std::cout << "Eneter Three Elements for Row: " << i + 1 << '\n';
        for (int j=0; j < 3; ++j){
            if (!(std::cin >> givenMatrix[i][j])) {  /* always VALIDATE input */
                std::cerr << "error: invalid integer input.\n";
                return 1;
            }
        }
    }
    /* pass given & pointer to function */
    printMatrix (givenMatrix, indexTranspose); 
}
$ ./bin/prn_mtrx_by_fn
Please input matrix values in the order described
Eneter Three Elements for Row: 1
1 2 3
Eneter Three Elements for Row: 2
4 5 6
Eneter Three Elements for Row: 3
7 8 9
   1   4   7
   2   5   8
   3   6   9