Преобразование массива double в complex

286
06 апреля 2017, 16:54

Здравствуйте. Подскажите, пожалуйста, я пытаюсь преобразовать массив double в массив complex, как мне говорили ранее, в действительной части мы записываем значения массива double, а мнимую часть присваиваем нулю. Я создал структуру Complex в проекте, объявил конструктор, который в качестве параметра принимает re (массив double), а мнимую часть присваивает нулю, дальше когда я с помощью метода пытаюсь преобразовать массив double в complex и результат возвратить в переменную signal, результат пока не возвращается, подскажите, пожалуйста, в чём у меня проблема?

public struct Complex 
{    
     // переменная, хранящая реальную часть комплексного числа            
     private double[] m_real;
     // переменная, хранящая мнимую часть комплексного числа
     private double m_imag;
     public Complex(double[] re)
     {
         m_real = re;
         m_imag = 0.0;
     }  
     // Свойства устанавливающие значения
     public double[] Re
     {
         get { return m_real; }
         set { m_real = value; }
     }
     public double Im
     {
        get { return m_imag; }
        set {m_imag = value; }
     }
     //Метод преобразующий массив double в complex
     public Complex[] ConvertToComplex(Double[] data)
     {
        Complex[] signal;
        Complex c1 = new Complex(data);
        signal = c1;
        return signal;
     }
}`

Подскажите, пожалуйста ещё, я объявил метод, так как Вы написали ниже public static Complex[] ConvertToComplex() { for (int i = 0; i < data.Length; i++) { signal[i] = data[i]; } return signal; }

переменные объявил как свойства, в глобальной области класса, так как из этих переменных информацию нужно получить и отправить потом в другие методы

   `// массив данных с wav-файла         
    public static Double[] data { set; get; }
    // массив данных с wav-файла в комплексном виде, предназначенный для БПФ
    public static Complex[] signal { set; get; }`

При выполнении метода ConvertToComplex() у меня выбрасывается исключение, показанное на рисунке ниже

Как мне его исправить?

Answer 1

Метод конвертирования массивов лучше сделать статическим, так как он по логике будет являться частью состояния типа Complex, а не экземпляров этого типа:

//Метод преобразующий массив double в complex
public static Complex[] ConvertToComplex(Double[] data)
{
    Complex[] signal = new Complex[data.Length];
    for (var i = 0; i < data.Length; i++)
    {
        var value = data[i];
        Complex c1 = new Complex(value);
        signal[i] = c1;
    }

    return signal;
}

а еще лучше - воспользоваться неявным оператором преобразования:

public static implicit operator Complex(double value)
{
    return new Complex(value);
}

Конструктор вашей структуры будет выглядеть так:

public Complex(double re) : this()
{
    Re = re;
    Im = 0.0;
}

В случае использования неявного оператора преобразования теперь можно писать так:

double[] doubleArr = ...
Complex[] complexArr = ...
for (var i = 0; i < doubleArr.Length; i++)
{
    complexArr[i] = doubleArr[i];
}
READ ALSO
Что такое делегат в языке С#?

Что такое делегат в языке С#?

Объясните простым, человеческим языком, кто такой и зачем нужен делегат в ООП вообще и в С# в частности? Спасибо!

390
C#. Изменение информации о файле.

C#. Изменение информации о файле.

Как изменить информацию о exe версию файла, версию продукта? К примеру изменить дату создания можно через IOFile

393
Как в Task реализовали Wait()?

Как в Task реализовали Wait()?

Я сомневаюсь, что TaskWait() внутри имеет цикл while

221
Редактирование DataGridView

Редактирование DataGridView

Не могу отредактировать ячейки из DataGridView хотя ReadOnly = False; Заполняю грид так :

274