C ++矩阵 - 最小/最大元素

时间:2014-03-05 22:11:21

标签: c++ matrix

我实现了可以找到矩阵元素的c ++程序: 这是行的最大元素,同时是其列的最小元素或行的 - min元素,同时也是其列的最大元素。 例如,我们有data.txt文件:

  • 4
  • 7 8 9 10
  • 6 5 4 11
  • 5 0 1 12
  • 4 2 7 13
  •   -

其中4是n - 矩阵大小(4x4),7和10是那些数字。

以下是代码:

#include <iostream>
#include <fstream>

using namespace std;
int main(){

    ifstream is;
    ofstream os;
    int n;

    is.open("data.txt");
    if (is.fail()){
        cout << "Failed to open data file" << endl;
        exit(-1);
    }
    is >> n;

    double **matrix;
    matrix = new double*[n];
    for (int i = 0; i < n; i++){
        matrix[i] = new double[n];
    }

    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            is >> matrix[i][j];
        }
    }

    double* maxROW = new double[n];
    double* minROW = new double[n];
    for (int i = 0; i < n; i++){
        maxROW[i] = matrix[i][0];
        minROW[i] = matrix[i][0];
        for (int j = 0; j < n; j++){
            if (matrix[i][j] > maxROW[i]){
                maxROW[i] = matrix[i][j];
            }
            if (matrix[i][j] < minROW[i]){
                minROW[i] = matrix[i][j];
            }
        }
    }

    double* maxCOLUMN = new double[n];
    double* minCOLUMN = new double[n];
    int x = 0;
    for (int i = 0; i < n; i++){
        maxCOLUMN[i] = matrix[0][x];
        minCOLUMN[i] = matrix[0][x];
        for (int j = 0; j < n; j++){
            if (matrix[j][i] > maxCOLUMN[i]){
                maxCOLUMN[i] = matrix[j][i];
            }
            if (matrix[j][i] < minCOLUMN[i]){
                minCOLUMN[i] = matrix[j][i];
            }

            if (j == n - 1) x++;
        }
    }

    int k = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            if (maxROW[i] == minCOLUMN[j]){
                k++;
            }
            if (minROW[i] == maxCOLUMN[j]){
                k++;
            }
        }
    }

    double* matrixNUM = new double[k];
    int l = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            if (maxROW[i] == minCOLUMN[j]){
                matrixNUM[l] = matrix[i][j];
                l++;
            }
            if (minROW[i] == maxCOLUMN[j]){
                matrixNUM[l] = matrix[i][j];
                l++;
            }
        }
    }

    cout << "Matrix numbers: " << endl;
    for (int i = 0; i < k; i++){
        cout << matrixNUM[i] << ", ";
    }
    cout << endl;

    for (int i = 0; i < n; i++){
        delete[] matrix[i];
    }
    delete[] matrix;
    delete[] maxCOLUMN;
    delete[] minCOLUMN;
    delete[] maxROW;
    delete[] minROW;
    delete[] matrixNUM;
    return 0;
}

问题:我想知道我的代码是否是“脏”代码?因为我总是热衷于使一切变得如此困难,因为它可以让它变得简单。是否有不同的方式,可能更容易,也许更容易理解的方式来实现这样的任务?在此先感谢谁将在此代码中发现错误。

2 个答案:

答案 0 :(得分:2)

int main(){

  std::ifstream is;
  std::ofstream os;

  is.open("data.txt");
  if (is.fail()){
    std::cerr << "Failed to open data file\n";
    exit(-1);
  }
  int n;
  is >> n;

  if (n <= 0)
  {
    std::cerr << "Negative matrix size, aborting\n";
    exit(-1);
  }
  std::vector< std::vector<double> > matrix( n, std::vector<double>(n) );

  for (int i = 0; i < n; i++){
    for (int j = 0; j < n; j++){
      is >> matrix[i][j];
    }
  }

  std::vector<double> maxROW(n);
  std::vector<double> minROW(n);
  for (int i = 0; i < n; i++){
    auto minmax = std::minmax_element( matrix[i].begin(), matrix[i].end() );
    maxROW[i] = *minmax.second;
    minROW[i] = *minmax.first;
  }

  std::vector<double> maxCOLUMN(n);
  std::vector<double> minCOLUMN(n);
  for (int i = 0; i < n; i++){
    maxCOLUMN[i] = matrix[0][i];
    minCOLUMN[i] = matrix[0][i];
    for (int j = 1; j < n; j++){
      maxCOLUMN[i] = std::max( maxCOLUMN[i], matrix[j][i] );
      minCOLUMN[i] = std::min( minCOLUMN[i], matrix[j][i] );
    }
  }

  std::vector<double> matrixNUM;
  for (int i = 0; i < n; i++){
    for (int j = 0; j < n; j++){
      if (maxROW[i] == minCOLUMN[j]){
        matrixNUM[l].push_back(matrix[i][j]);
      }
      if (minROW[i] == maxCOLUMN[j]){
        matrixNUM[l].push_back(matrix[i][j]);
      }
    }
  }

  std::cout << "Matrix numbers: " << endl;
  for (double num:matrixNUM)
    std::cout << num << ", ";
  }
  std::cout << "\n";
}

可能存在拼写错误,但上述内容应该同样快,代码也少。

它确实使用了一些C ++ 11功能。

答案 1 :(得分:0)

随机注意,C ++ 11在其可变长度数组处理方面仍然有一些繁琐的方面,但是:

int n;          is >> n;

double (&matrix)[n][n] = *(double(*)[n][n])(new double[n*n]);

for (auto &r:matrix)
        for (auto &c:r)
                is >> c;

// ...

delete[] &matrix

非常好。