程序输出问题

发布于 2024-09-30 13:04:16 字数 5223 浏览 0 评论 0原文

下面是我的程序,我的行列式函数有问题。

文件输入是:

2
1 0
0 1
3
8 9 1
3 5 2
-2 3 -1
0

对于第二个矩阵,它正在读取 nan 作为输入文件中矩阵二的行列式函数的结果,对于我的代码可能出现什么问题有什么想法吗?

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

const int maxsize = 10;

ifstream fin;
ofstream fout;

void transpose (double omatrix[][maxsize],double tmatrix [][maxsize], int array_size)
{
    for(int i = 0; i < array_size; i++)
    {
        for(int j = 0; j < array_size; j++)
        {
            tmatrix[j][i] = omatrix[i][j];
        }


    }
}

void sub (double omatrix[][maxsize], double smatrix[][maxsize], int array_size, int i, int j)
{
    int counter1 = 0, counter2 = 0;

    for (int a = 0; a < array_size; a++)
    {
        if (a != i)
        {
            for (int b = 0; b < array_size; b++)
            {
                if (b != j)
                {
                    smatrix[counter1][counter2] = omatrix[a][b];
                    counter2++;
                }
            }
            counter1++;
        }
    }
}

double determininant(double original_matrix[][maxsize], int array_size)
{
    double D = 0.0, temp[maxsize][maxsize];

    if(array_size == 1)
    {
        return original_matrix[0][0];
    }

    else if(array_size == 2)
    {
        return (original_matrix[0][0] * original_matrix[1][1]) - (original_matrix[0][1] * original_matrix[1][0]);
    }
    for(int i = 0; i < array_size; i++)
    {
        sub (original_matrix,temp,array_size, 0, i);
        D += pow(-1.0,i) * original_matrix[0][i] * determininant(temp, array_size - 1);
    }
    return D;
}

void inverse(double omatrix[][maxsize], int array_size, double imatrix[][maxsize])
{
    double D = determininant(omatrix, array_size);
    double c[maxsize][maxsize];

    if (D != 0)
    {
        for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    sub (omatrix, c, array_size, i, j);
                    imatrix[j][i] = pow(-1.0, i+j) * determininant( c, array_size - 1) / D;
                }
            }
    }
}

void mult(double omatrix[][maxsize], double imatrix[][maxsize], double pmatrix[][maxsize], int array_size)
{
    for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    pmatrix[i][j] = 0;

                    for(int k = 0; k < array_size; k++)
                    {
                        pmatrix[i][j] += omatrix[i][k] *imatrix[k][j];
                    }
                }
            }
}

void print (const double m[][maxsize], int array_size)
{
    for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    fout << m[i][j] << "  ";
                }
                fout << "\n";
            }
            fout << "\n";
}


int main()
{
    double original_matrix[maxsize][maxsize],
           inverse_matrix [maxsize][maxsize],
           transposed_matrix[maxsize][maxsize],
           product_matrix [maxsize][maxsize],
           D;


    int array_size;

    fout.setf(ios::fixed);
    fout.precision(2);

    char File_Name[10];
    cout << "Please enter a name for the output file";
    cin >> File_Name;

    fin.open ("input.txt");
    fout.open (File_Name);

    if (fin.fail())
    {
        cout << "Input file opening failed. \n";
        return 0;
    }

    while(fin >> array_size)
    {
        if(array_size != 0)
        {
            for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    fin >> original_matrix[i][j];
                }
            }

            fout << "THE ORIGIONAL ARRAY! \n";
            print (original_matrix, array_size);
            transpose (original_matrix, transposed_matrix, array_size);
            fout << "THE TRANSPOSED VIRSION! \n";
            print (transposed_matrix, array_size);
            fout << determininant(original_matrix, array_size) << "\n\n";
            inverse(original_matrix, array_size, inverse_matrix);
            print (inverse_matrix, array_size);
            mult(original_matrix, inverse_matrix, product_matrix, array_size);
            print (product_matrix, array_size);


        }
    }

    fin.close();
    fout.close();

    return 0;
}

输出是:

THE ORIGIONAL ARRAY! 
1.00  0.00  
0.00  1.00  

THE TRANSPOSED VIRSION! 
1.00  0.00  
0.00  1.00  

1.00

1.00  -0.00  
-0.00  1.00  

1.00  0.00  
0.00  1.00  

THE ORIGIONAL ARRAY! 
8.00  9.00  1.00  
3.00  5.00  2.00  
-2.00  3.00  -1.00  

THE TRANSPOSED VIRSION! 
8.00  3.00  -2.00  
9.00  5.00  3.00  
1.00  2.00  -1.00  

nan                              <--------------------- is wrong should be -78.00
                                                        which makes the next 2 mess up.
0.00  -0.00  0.00  
-0.00  0.00  -0.00  
0.00  -0.00  0.00  

0.00  0.00  0.00  
0.00  0.00  0.00  
0.00  0.00  0.00  

Below is my program and im having a problem with the determinant function.

File input is:

2
1 0
0 1
3
8 9 1
3 5 2
-2 3 -1
0

and for the second matrix it is reading nan for the result of the determinant function for matrix two in the input file, any ideas for what could be going wrong with my code?

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

const int maxsize = 10;

ifstream fin;
ofstream fout;

void transpose (double omatrix[][maxsize],double tmatrix [][maxsize], int array_size)
{
    for(int i = 0; i < array_size; i++)
    {
        for(int j = 0; j < array_size; j++)
        {
            tmatrix[j][i] = omatrix[i][j];
        }


    }
}

void sub (double omatrix[][maxsize], double smatrix[][maxsize], int array_size, int i, int j)
{
    int counter1 = 0, counter2 = 0;

    for (int a = 0; a < array_size; a++)
    {
        if (a != i)
        {
            for (int b = 0; b < array_size; b++)
            {
                if (b != j)
                {
                    smatrix[counter1][counter2] = omatrix[a][b];
                    counter2++;
                }
            }
            counter1++;
        }
    }
}

double determininant(double original_matrix[][maxsize], int array_size)
{
    double D = 0.0, temp[maxsize][maxsize];

    if(array_size == 1)
    {
        return original_matrix[0][0];
    }

    else if(array_size == 2)
    {
        return (original_matrix[0][0] * original_matrix[1][1]) - (original_matrix[0][1] * original_matrix[1][0]);
    }
    for(int i = 0; i < array_size; i++)
    {
        sub (original_matrix,temp,array_size, 0, i);
        D += pow(-1.0,i) * original_matrix[0][i] * determininant(temp, array_size - 1);
    }
    return D;
}

void inverse(double omatrix[][maxsize], int array_size, double imatrix[][maxsize])
{
    double D = determininant(omatrix, array_size);
    double c[maxsize][maxsize];

    if (D != 0)
    {
        for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    sub (omatrix, c, array_size, i, j);
                    imatrix[j][i] = pow(-1.0, i+j) * determininant( c, array_size - 1) / D;
                }
            }
    }
}

void mult(double omatrix[][maxsize], double imatrix[][maxsize], double pmatrix[][maxsize], int array_size)
{
    for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    pmatrix[i][j] = 0;

                    for(int k = 0; k < array_size; k++)
                    {
                        pmatrix[i][j] += omatrix[i][k] *imatrix[k][j];
                    }
                }
            }
}

void print (const double m[][maxsize], int array_size)
{
    for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    fout << m[i][j] << "  ";
                }
                fout << "\n";
            }
            fout << "\n";
}


int main()
{
    double original_matrix[maxsize][maxsize],
           inverse_matrix [maxsize][maxsize],
           transposed_matrix[maxsize][maxsize],
           product_matrix [maxsize][maxsize],
           D;


    int array_size;

    fout.setf(ios::fixed);
    fout.precision(2);

    char File_Name[10];
    cout << "Please enter a name for the output file";
    cin >> File_Name;

    fin.open ("input.txt");
    fout.open (File_Name);

    if (fin.fail())
    {
        cout << "Input file opening failed. \n";
        return 0;
    }

    while(fin >> array_size)
    {
        if(array_size != 0)
        {
            for(int i = 0; i < array_size; i++)
            {
                for(int j = 0; j < array_size; j++)
                {
                    fin >> original_matrix[i][j];
                }
            }

            fout << "THE ORIGIONAL ARRAY! \n";
            print (original_matrix, array_size);
            transpose (original_matrix, transposed_matrix, array_size);
            fout << "THE TRANSPOSED VIRSION! \n";
            print (transposed_matrix, array_size);
            fout << determininant(original_matrix, array_size) << "\n\n";
            inverse(original_matrix, array_size, inverse_matrix);
            print (inverse_matrix, array_size);
            mult(original_matrix, inverse_matrix, product_matrix, array_size);
            print (product_matrix, array_size);


        }
    }

    fin.close();
    fout.close();

    return 0;
}

The output is:

THE ORIGIONAL ARRAY! 
1.00  0.00  
0.00  1.00  

THE TRANSPOSED VIRSION! 
1.00  0.00  
0.00  1.00  

1.00

1.00  -0.00  
-0.00  1.00  

1.00  0.00  
0.00  1.00  

THE ORIGIONAL ARRAY! 
8.00  9.00  1.00  
3.00  5.00  2.00  
-2.00  3.00  -1.00  

THE TRANSPOSED VIRSION! 
8.00  3.00  -2.00  
9.00  5.00  3.00  
1.00  2.00  -1.00  

nan                              <--------------------- is wrong should be -78.00
                                                        which makes the next 2 mess up.
0.00  -0.00  0.00  
-0.00  0.00  -0.00  
0.00  -0.00  0.00  

0.00  0.00  0.00  
0.00  0.00  0.00  
0.00  0.00  0.00  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

痴情换悲伤 2024-10-07 13:04:16

您忘记在 sub(...) 中重置 counter2。因此,您将复制到结果矩阵中的错误位置,并在计算中使用未初始化的内存。

(这个故事的寓意是在您实际需要的尽可能小的范围内声明变量。)

You are forgetting to reset counter2 in sub(...). So you are copying into the wrong place in the result matrix, and using uninitialized memory in your calculations.

(The moral of the story is to declare variables in the smallest possible scope where you actually need them.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文