Как представить комплексную матрицу из 2 вещественных матриц - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь представить матрицу комплексных чисел, используя 2 матрицы действительных значений (в Pytorch, но здесь используется numpy только для иллюстративных целей).

В настоящее время я делаю это так:

import numpy as np

# represent real
X = np.random.randn(10,10)

# represent imaginary
I = np.random.randn(10,10)

# build complex matrix using the identity
real = np.concatenate([X, -I], axis=-1)
img = np.concatenate([I, X], axis=-1)
complex_W = np.concatenate([real, img,], axis=0)

# is complex_W now correctly represented?? 

Могу ли я сделать это также?

# represent real
X = np.random.randn(10,10)

# represent imaginary
I = np.random.randn(10,10)

complex_W = X + I

1 Ответ

0 голосов
/ 31 января 2019

Вы можете реализовать сложную структуру данных ndarray, используя массивы numpy.Возможно, вы захотите сохранить действительную часть в одной переменной данных и комплексную в переменной anthor.Python предоставляет способ перегрузки некоторых операторов, включая +, -, *, /.Например, в следующем классе реализована сложная структура данных с тремя операторами (+, -, *)

class ComplexNDArray(object):
    def __init__(self, real, imaginary):
        self.real = real
        self.imaginary = imaginary
    @property
    def real(self):
        return self.__real
    @real.setter
    def real(self, value):
        if type(value) == np.ndarray:
            self.__real = value
        elif isinstance(value, (int, float, list, tuple)):
            self.__real = np.array(value)
        else:
            raise ValueError("Unsupported type value:%s" % (str(type(value))))
    @property
    def imaginary(self):
        return self.__imaginary
    @imaginary.setter
    def imaginary(self, value):
        if type(value) == np.ndarray:
            self.__imaginary = value
        elif isinstance(value, (int, float, list, tuple)):
            self.__imaginary = np.array(value)
        else:
            raise ValueError("Unsupported type value:%s" % (str(type(value))))
    def __add__(self, other):
        real = self.real + other.real
        imaginary = self.imaginary + other.imaginary
        return ComplexNDArray(real, imaginary)
    def __sub__(self, other):
        real = self.real - other.real
        imaginary = self.imaginary - other.imaginary
        return ComplexNDArray(real, imaginary)
    def __mul__(self, other):
        real = self.real * other.real - self.imaginary * other.imaginary
        imaginary = self.real * other.imaginary + self.imaginary * other.real
        return ComplexNDArray(real, imaginary)
    def __str__(self):
        return str(self.real) + "+"+str(self.imaginary)+"i"

Теперь вы можете использовать эту структуру данных для выполнения некоторых операций.

a  = np.array([1, 2,3])
b = np.array([4, 5, 1])
c  = np.array([4, 7,3])
d  = np.array([5, 1,7])
cmplx = ComplexNDArray(a, b)
cmplx2 = ComplexNDArray(c, d)

print(cmplx)        # [1 2 3]+[4 5 1]i
print(cmplx2)       # [4 7 3]+[5 1 7]i
print(cmplx+cmplx2) # [5 9 6]+[9 6 8]i
print(cmplx-cmplx2) # [-3 -5  0]+[-1  4 -6]i
print(cmplx*cmplx2) # [-16   9   2]+[21 37 24]i
...