std::complex con el error C2106: ‘=’: el operando izquierdo debe ser un l-valor
Realicé una transformada rápida de Fourier (fft) en mi señal
, convirtiéndola en signalComplex
; signal
es una serie de números flotantes reales y signalComplex
representa una serie de números complejos:
std::vector<std::complex<float>> signalComplex(numSamplesPerScan); // int numSamplesPerScan
fft.fwd(signalComplex, signal); // std::vector<float> signal
for (int n = 1; n < numSamplesPerScan / 2; n++) // procedimiento simplificado para calcular HT
{
float real = signalComplex[n].real(); // frecuencia positiva X 2
float imag = signalComplex[n].imag();
real *= 2;
imag *= 2;
signalComplex[n].real() = real; // el compilador se queja aquí
signalComplex[n].imag() = imag; // el compilador se queja aquí
signalComplex[n + numSamplesPerScan / 2].real() = 0; // el compilador se queja aquí
signalComplex[n + numSamplesPerScan / 2].imag() = 0; // el compilador se queja aquí
}
En el bucle for anterior, estoy tratando de hacer una simple operación en las partes reales e imaginarias de signalComplex
. Sin embargo, el compilador se queja de “”error C2106: ‘=’: el operando izquierdo debe ser una l-value“; no estoy seguro de cómo realizar la computación en las partes reales e imaginarias en este caso.
Cualquier indicación es apreciada. Se agradecería mucho algo de código.
davy.ai
Las funciones miembro
signalComplex[n].real()
ysignalComplex[n].imag()
son funciones const, lo que significa que devuelven una referencia constante a unfloat
, y no podemos modificar el valor devuelto por ellas. Puedes resolver este problema almacenando el resultado designalComplex[n]
en un objeto separadostd::complex<float>
, y luego modificar sus valores, y finalmente establecersignalComplex[n]
con este objetostd::complex<float>
actualizado. Aquí está el código modificado:“`c++> signalComplex(numSamplesPerScan);
std::vector<>
fft.fwd(signalComplex, signal);
for (int n = 1; n < numSamplesPerScan / 2; n++) cmplx = signalComplex[n];
{
std::complex
cmplx.real(cmplx.real() * 2);
cmplx.imag(cmplx.imag() * 2);
}
“`
Aquí, creamos un objeto temporal
std::complex<float>
llamadocmplx
y asignamossignalComplex[n]
a él. Luego modificamos sus partesreal()
eimag()
, y luego establecemossignalComplex[n]
con el objetocmplx
actualizado. También establecemossignalComplex[n + numSamplesPerScan / 2]
en un nuevo objetostd::complex<float>
con partes reales e imaginarias iguales a cero.