在 2D 向量上执行单行算术以找到简化的行形式 C++

Posted

技术标签:

【中文标题】在 2D 向量上执行单行算术以找到简化的行形式 C++【英文标题】:Performing Single Row Arithmetic on 2D Vector to find Reduced Row Form C++ 【发布时间】:2021-02-24 03:18:41 【问题描述】:

因此,对于交流电路,有时您必须解决具有复数的线性系统,而我正在编写一个快速而肮脏的程序来为我做这件事。我已经编写了将创建用户定义大小和输入的矩阵(2D 向量)的代码,我只是不知道如何让它逐行执行算术运算。我尝试遍历第一行并将每个元素乘以 1/matrix[1][1] 但是它给了我一条错误消息,说我无法执行该操作。这是我到目前为止用于上述目的的代码。我对 c++ 和整体编码比较陌生,所以我可能缺少一种简单的方法来做到这一点。

#include <iostream>
#include <vector>
#include <cmath>
#include <complex>

using namespace std;
int main() 


    int rows;
    int columns;
    cout << "Enter number of rows: " << endl;
    cin >> rows;
    cout << "Enter number of columns: " << endl;
    cin >> columns;

    vector<vector<complex<double> > > matrix(rows, vector<complex<double> > (columns));
    int k = 0;
    for (int i = 0; i < rows; i++)
    
        k++;
        cout << "Enter row " << k << ": " << endl;
            
        for (int j = 0; j < columns; j++)
        
            complex<double> input;
            cin >> input;
            matrix[i][j] = input;
        

    

    for (int g = 0; g < rows; g++)
    
        for (int h = 0; h < columns; h++)
        
            cout << matrix[g][h] << " ";
        
        cout << endl;
    
    
for (int b = 0; b < columns; b++) 
        matrix[1][1] = a;
        matrix[1][b] = (matrix[1][b]) * (1 / a)

    
    return 0;
`

【问题讨论】:

你能显示给你错误的代码以及完整的错误信息吗? 我添加了给我带来麻烦的 for 循环。它不是错误消息,但 Visual Studio 在我尝试执行操作的除法符号下方有红色下划线(1 / a)。 【参考方案1】:

我尝试遍历第一行并将每个元素乘以1/matrix[1][1],但是它给了我一条错误消息,说我无法执行该操作。

如果matrix 被声明为

vector<vector<complex<double> > > matrix(rows, vector<complex<double> > (columns));

其元素的类型为std::complex&lt;double&gt;,因此底层类型为double

二进制math operators有重载接受复杂和标量类型,但类型需要匹配:

// since C++20 those are constexpr
template< class T >
constexpr std::complex<T> operator/( const std::complex<T>& lhs
                                   , const std::complex<T>& rhs );
template< class T >
constexpr std::complex<T> operator/( const std::complex<T>& lhs, const T& rhs);
//                                                      ^              ^
template< class T >
constexpr std::complex<T> operator/( const T& lhs, const std::complex<T>& rhs);
//                                         ^                          ^

OP 提到

1 / matrix[1][1]
^ That's an int, not a double. 1.0 would have worked (note that 1.0f wouldn't).

【讨论】:

【参考方案2】:

您必须手动将它们转换为复杂的,或者匹配它的类型

std::complex<double> x(1, 2); // x = 1.0 + 2.0i

// x * 3 Error!, 3 is int
auto y = x * std::complex<double>(3, 0); // works! y = 3.0 + 6.0i
auto z = x * 3.0

【讨论】:

嗯,不是真的。 math operators 的重载接受复杂和标量类型,但types have to match。

以上是关于在 2D 向量上执行单行算术以找到简化的行形式 C++的主要内容,如果未能解决你的问题,请参考以下文章

2D 向量的 C++ 问题:执行时,您的代码以非法的方式修改了内存

如何编写函数以交换2D数组中的行(c ++)

如何以可移植的方式在 C 中执行算术右移?

在位向量算术的决策过程中使用术语重写

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)

将单行向量(数组)赋值转换为经典数组,C++ 转换为 C