Reputation: 45
I am trying to multiple every element of a complex array by a multiplying factor, for the application of fourier transform. I am applying a hanning window filter to a complex file of a wave function.
I am working in C++ with CodeBlocks, I keep getting -->
error: invalid types 'double[int]' for array subscript
My code is here:
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <cmath>
#define PI 3.14159265359
using namespace std;
class Complex {
public:
Complex();
Complex(double realNum);
Complex(double realNum, double imagNum);
//Complex(double real = 0.0, double imaginary = 0.0); This avoids the 3 above?
Complex(const Complex& obj);
private:
double real;
double imaginary;
};
Complex::Complex(const Complex& obj) {
real = obj.real;
imaginary = obj.imaginary;
}
Complex::Complex () {
real = 0;
imaginary = 0;
}
Complex::Complex (double realNum) {
real = realNum;
imaginary = 0;
}
Complex::Complex (double realNum, double imagNum) {
real = realNum;
imaginary = imagNum;
}
int main () {
Complex *complexArray = new Complex[1000];
ifstream myfile("myfile.txt");
/* this will match the complex numbers of the form - 123.123 + 14.1244 or 123 - 1343.193 and so on,
basically assumes that both the real and the imaginary parts are both doubles*/
regex reg_obj("^[ ]*([-]?\\d+(\\.\\d+)?)\\s*([+-])\\s*(\\d+(\\.\\d+)?)i");
smatch sm;
string line;
int i = 0;
double real, imag;
if (myfile.is_open()) {
while (! myfile.eof()) {
getline(myfile, line);
if(regex_search(line, sm, reg_obj)){
real = stod(sm[1]); // this ([-]?\\d+(\\.\\d+)?) is group 1 and will match the real part of the number
imag = stod(sm[4]); // second group (\\d+(\\.\\d+)?)i is group 4 which matches the imaginary part of the complex number without matching + or - which are taken care of separately because there could be space between the +|- symbol and the imaginary part
if(sm[3]=="-") imag = -imag;
complexArray[i] = Complex(real, imag);
i++;
}
// Hanning Window
for (int i = 0; i < 1000; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[i] = multiplier[i] * complexArray[i];
}
}
myfile.close();
}else {
cout << "Error. Could not find/open file." ;
}
cout << complexArray << endl;
return 0;
};
I would like to multiply each element of the complex object by each element in the multiplication array. I'm not sure of the correct way to do this.
Upvotes: 0
Views: 473
Reputation: 310960
For starters in this loop
for (int i = 0; i < 1000; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[i] = multiplier[i] * complexArray[i];
}
the variable multiplier
is declared as a scalar object of the type double. So you need to write
complexArray[i] = multiplier * complexArray[i];
instead of
complexArray[i] = multiplier[i] * complexArray[i];
Also you need to overload the operator *
for your class.
For example
class Complex {
public:
Complex();
Complex(double realNum);
Complex(double realNum, double imagNum);
//Complex(double real = 0.0, double imaginary = 0.0); This avoids the 3 above?
Complex(const Complex& obj);
friend const Complex operator *( double, const Complex & );
private:
double real;
double imaginary;
};
//...
const Complex operator *( double value, const Complex &c )
{
return { value * c.real, value * c.imaginary };
}
Also the condition in the while loop
while (! myfile.eof()) {
getline(myfile, line);
//...
substitute for
while ( getline(myfile, line) ) {
//...
And this loop
for (int i = 0; i < 1000; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[i] = multiplier[i] * complexArray[i];
}
should be outside the while loop. For example
for ( int j = 0; j < i; j++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[j] = multiplier * complexArray[j];
}
Upvotes: 2