C++ 如何将计算矩阵转置的函数的结果传递给打印矩阵的另一个函数?
我创建了两个函数,一个用于查找函数的转置,另一个用于打印函数。我知道printMatrix函数很好用。 但是,我不知道如何使用函数转置矩阵,然后打印它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 " <<
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