es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Las funciones miembro signalComplex[n].real() y signalComplex[n].imag() son funciones const, lo que significa que devuelven una referencia constante a un float, y no podemos modificar el valor devuelto por ellas. Puedes resolver este problema almacenando el resultado de signalComplex[n] en un objeto separado std::complex<float>, y luego modificar sus valores, y finalmente establecer signalComplex[n] con este objeto std::complex<float> actualizado. Aquí está el código modificado:

    “`c++
    std::vector<>> signalComplex(numSamplesPerScan);
    fft.fwd(signalComplex, signal);

    for (int n = 1; n < numSamplesPerScan / 2; n++)
    {
    std::complex cmplx = signalComplex[n];
    cmplx.real(cmplx.real() * 2);
    cmplx.imag(cmplx.imag() * 2);

    signalComplex[n] = cmplx;
    signalComplex[n + numSamplesPerScan / 2] = std::complex<float>(0, 0);
    

    }
    “`

    Aquí, creamos un objeto temporal std::complex<float> llamado cmplx y asignamos signalComplex[n] a él. Luego modificamos sus partes real() e imag(), y luego establecemos signalComplex[n] con el objeto cmplx actualizado. También establecemos signalComplex[n + numSamplesPerScan / 2] en un nuevo objeto std::complex<float> con partes reales e imaginarias iguales a cero.

Comments are closed.