我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件:
其中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;
}
问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否有一种不同的方式,也许更容易,也许更容易理解的方式来执行这样的任务?提前感谢那些会在代码中发现错误的人。
随机注意,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
堆叠得很好。
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,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输
我有几个维度的多维矩阵,其中中的每个元素都是一个单独的传感器输入,是时间。我想做的是只分析中每个元素在上的峰值,因此我将得到一个的二维矩阵,其中只包含最大值。 我知道有很多方法可以获得单个整体最大值,但是有没有一种方法可以将它与逐个元素的操作相结合,比如,这样它就可以通过检查每个单独的元素? 如果你能给我任何帮助,我将感激不尽,因为我现在真的被困住了。提前谢谢!