2017-02-01 4 views
1

У меня есть два комплексных векторов:Умножение комплексных векторов в Swift

a = [(0.5 + 2.0i), (-1.0 - 3.0i), (-3.0 + 1.5i)] 

b = [(-0.5 - 2.2i), (1.3 + 2.0i), (3.0 - 2.5i)] 

In Matlab, c = a.*b 

То есть, поэлементно умножения двух комплексных векторов дает мне:

c = [(4.15 - 2.1i), (4.7 - 5.9i), (-5.25 + 12.0i)] 

Вообще, в Swift, я представляют действительную и мнимую части комплексных векторов в отдельных массивах.

Так,

let aReal = [0.5, -1.0, -3.0] 

let bReal = [-0.5, 1.3, 3.0] 

let aImag = [2.0, -3.0, 1.5] 

let bImag = [-2.2, 2.0, -2.5] 

Исходя из вышеизложенного умножения, в Swift, я ищу, чтобы получить:

// cReal = [4.15, 4.7, -5.25] 

// cImag = [-2.1, -5.9, 12.0] 
+0

https://github.com/dankogai/swift2-pons попробовать этот LIB поддержку комплексных чисел и угробить идею поддержки 2 массива – Alistra

+0

после этого просто сделайте оператор на '[Complex]', чтобы сделать это, так что это выглядит как matlab. – Alistra

ответ

2

Это зависит от того, что вы делаете с ними, но я бы определите тип Complex с оператором *. Например, в Swift 3:

struct Complex<T: FloatingPoint> { 
    let real: T 
    let imaginary: T 

    static func +(lhs: Complex<T>, rhs: Complex<T>) -> Complex<T> { 
     return Complex(real: lhs.real + rhs.real, imaginary: lhs.imaginary + rhs.imaginary) 
    } 

    static func -(lhs: Complex<T>, rhs: Complex<T>) -> Complex<T> { 
     return Complex(real: lhs.real - rhs.real, imaginary: lhs.imaginary - rhs.imaginary) 
    } 

    static func *(lhs: Complex<T>, rhs: Complex<T>) -> Complex<T> { 
     return Complex(real: lhs.real * rhs.real - lhs.imaginary * rhs.imaginary, 
         imaginary: lhs.imaginary * rhs.real + lhs.real * rhs.imaginary) 
    } 
} 

// you can print it any way you want, but I'd probably do: 

extension Complex: CustomStringConvertible { 
    var description: String { 
     switch (real, imaginary) { 
     case (_, 0): 
      return "\(real)" 
     case (0, _): 
      return "\(imaginary)i" 
     case (_, let b) where b < 0: 
      return "\(real) - \(abs(imaginary))i" 
     default: 
      return "\(real) + \(imaginary)i" 
     } 
    } 
} 

Вы можете использовать zip и map взять два массив и выполнить некоторые вычисления с соответствующими значениями из двух массивов:

let a = [Complex<Double>(real: 0.5, imaginary: 2.0), Complex<Double>(real: -1.0, imaginary: -3.0), Complex<Double>(real: -3.0, imaginary: 1.5)] 
let b = [Complex<Double>(real: -0.5, imaginary: -2.2), Complex<Double>(real: 1.3, imaginary: 2.0), Complex<Double>(real: 3.0, imaginary: -2.5)] 

let c = zip(a, b).map { $0 * $1 } 

print(c) 

И что сказало бы:

[4,15 - 2.1i, 4.7 - 5.9i, -5,25 + 12.0i]

Или, если у вас действительно есть свои отдельные массивы, конвертировать их в [Complex] первый:

let aReal = [0.5, -1.0, -3.0] 
let aImag = [2.0, -3.0, 1.5] 

let bReal = [-0.5, 1.3, 3.0] 
let bImag = [-2.2, 2.0, -2.5] 

let a = zip(aReal, aImag).map { Complex<Double>(real: $0, imaginary: $1) } 
let b = zip(bReal, bImag).map { Complex<Double>(real: $0, imaginary: $1) } 

let c = zip(a, b).map { $0 * $1 } 
print(c) 
+0

Большое вам спасибо. Это великолепно! Поскольку у меня есть отдельные массивы, мне нравится последний вариант. Что мне нужно сделать, чтобы получить только реальный вектор c и только мнимый вектор c (без i)? То есть, cReal = [4.15, 4.7, -5.25] & cImag = [-2.1, -5.9, 12.0]. – Pat

+0

Мне нужны те вторые векторы c для дальнейшего анализа. – Pat

+0

'let cReal = c.map {$ 0.real}' и 'let cImag = c.map {$ 0.imaginary}'. – Rob

Смежные вопросы