当前位置: 首页 > 知识库问答 >
问题:

C矩阵-最小/最大元素

胡志
2023-03-14

我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的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个答案

司马弘益
2023-03-14

随机注意,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

堆叠得很好。

敖和韵
2023-03-14
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+2+5=8 但是,最大值为5。 我希望将组合选择为 所以我想要的输出是:4,3,2 而不是成本最小化。我想选择一个最小最大数量的组合。

  • 这个问题可能是封闭的,因为它听起来很模糊,但我真的问这个,因为我不知道或者我的数学背景不够。 我试图实现一个挑战,其中一部分挑战要求我计算矩阵的最小值和最大值。我对矩阵的实现及其操作没有任何问题,但是什么是矩阵的最小值和最大值?考虑到3x3矩阵是9个数中最小的数,最大的是最大的还是其他什么?

  • 给定一个2维正整数数组,求和最大的HxW子矩形。矩形的总和是该矩形中所有元素的总和。 输入:具有正元素的二维数组NxN子矩形的HxW大小 输出:HxW大小的子矩阵,其元素的总和最大。 我已经使用蛮力方法解决了这个问题,但是,我现在正在寻找一个具有更好复杂性的更好的解决方案(我的蛮力法的复杂性是O(n6))。

  • 我有一个大的NxN位数组,有K个1(其他都是0)。所有非零点的坐标都是已知的——换句话说,这个n×n数组可以表示为K对数组,每个数组包含一个非零点的x和y坐标。 给定一个HxW大小的子矩阵,我需要将其放在我的原始NxN数组上,使其覆盖大多数非零点。 输入:子矩阵的高度H和宽度W 输出:HxW子数组的x和y协弦,其内部有最多的协弦 之前也回答过类似的问题:2D矩阵中尺寸为HxW的最大子阵列,但在我的

  • 所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败。 问题是: 给定一个矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素。 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素。 例子: 返回: 13 我的方法是使用minHeap,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输

  • 我有几个维度的多维矩阵,其中中的每个元素都是一个单独的传感器输入,是时间。我想做的是只分析中每个元素在上的峰值,因此我将得到一个的二维矩阵,其中只包含最大值。 我知道有很多方法可以获得单个整体最大值,但是有没有一种方法可以将它与逐个元素的操作相结合,比如,这样它就可以通过检查每个单独的元素? 如果你能给我任何帮助,我将感激不尽,因为我现在真的被困住了。提前谢谢!