gpt4 book ai didi

c++ - 如何在 C++ 中使用 2 个循环制作一个完整的矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:09 25 4
gpt4 key购买 nike

我在 C++ 中有一个字符串,它代表一个上三角矩阵,我想做的是从这个字符串中生成一个完整的矩阵

    std::string input = "1,2,1,3,6,1,4,7,9,1";
//this represents


//1 2 3 4
//2 1 6 7
//3 6 1 9
//4 7 9 1

std::replace(input.begin(), input.end(), ',', ' ');
std::vector<double> Matrix;
std::istringstream inputStream(input);
double value;
int rowNum = 0;
int colNum = 0;

while (inputStream >> value){
for (colNum = 0; colNum < 2; colNum++){
if (colNum >= rowNum){
Matrix.push_back( value );
}
else{
Matrix.push_back( Matrix[colNum * 2 + rowNum]);
}
}

rowNum++;
}
inputStream >> std::ws;

而不是得到

 1  2  3 4
2 1 6 7
3 6 1 9
4 7 9 1

但是我得到了

   1.0000   1.0000   1.0000   2.0000
1.0000 1.0000 2.0000 1.0000
1.0000 2.0000 1.0000 1.0000
2.0000 1.0000 1.0000 2.0000

我的错误是什么?我看不到它...

最佳答案

您应该显示用于打印输出的索引方案(即您期望索引如何工作):您选择使用 vector 而不是矩阵使得很难更正代码。当然,我看到以下几点与输入模式没有明确的联系:

1) 你读到的每个数字都会增加 rowNum 索引。该行应该递增,而不是在“步骤”1、1+2、1+2+3,...

2) colNum 的范围应该从 0 到当前 rowNum,而不是假设只有 0,1

3) 在阅读(说最后一行)之前没有机会填满一行(比如第一行)。如果输入是 1 2 3 4 1 6 7 1 9 1 你可以这样做

所有这些点都是相关的,并且源于错误的数据表示,这使得一项微不足道的任务变得困难。

在 C++ 中,解决这些问题的一种非常有效的方法是数据隐藏:考虑一下我们可以多么轻松地编写一个提供正确逻辑表示且不浪费空间的类:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>

template <class T = double>
class upper_triangular_matrix
{
std::vector<T> Matrix;

public:

upper_triangular_matrix(std::string input)
{
// trade time for space: store the values, compute indexing
std::replace(input.begin(), input.end(), ',', ' ');
std::istringstream inputStream(input);
T value;
while (inputStream >> value)
Matrix.push_back(value);

// validate size: ok 1,1+2,1+2+3 etc
}

T operator()(int r, int c) const
{
// compute indexing accounting for miss duplicated
if (c > r)
std::swap(c, r);
int p = 0, n = 1;
while (r > 0)
{
p += n++;
r--;
}
return Matrix[p + c];
}
};

int main()
{
upper_triangular_matrix<> m("1,2,1,3,6,1,4,7,9,1");
for (int r = 0; r < 4; ++r)
{
for (int c = 0; c < 4; ++c)
std::cout << m(r, c) << ' ';
std::cout << std::endl;
}
}

运行时打印

1 2 3 4 
2 1 6 7
3 6 1 9
4 7 9 1

关于c++ - 如何在 C++ 中使用 2 个循环制作一个完整的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8980813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com