Как я могу закодировать матрицу в матрице, используя цикл? - PullRequest
0 голосов
/ 26 мая 2019

Итак, у меня есть матрица 3x3 G (здесь она не показана, она не имеет отношения к моей проблеме), которую я создал, используя две переменные u (вектор, x - y) и скаляр k. x_j = (x_1 (j), x_2 (j), x_3 (j)) и y_j = (y_1 (j), y_2 (j), y_3 (j)). alpha_j - это матрица 3x3 Матрица A является блочной диагональной матрицей размером 3nx3n. У меня проблемы с матрицей W Как мне кодировать матрицу размером 3nx3n, где (i, j) -й блок - это матрица 3x3, заданная alpha_i * G_ [ij] * alpha_j ?? Я потерян.

Кажется, у моей матрицы alpha_j тоже есть проблемы. Цикл продолжает выдавать ошибку: «Только массивы длины 1 могут быть преобразованы в скаляры Python». Пожалуйста, помогите: /

def W(x, y, k, alpha, A):
    u = x - y
    n = x.shape[0]
    W = np.zeros((3*n, 3*n))

    for i in range(0, n-1):
        for j in range(0, n-1):
                #u = -np.array([[x[i,0] - x[j,0]], [x[i,1] -               x[j,1]], [0]]) ??
                W[i][j] = (alpha_j(alpha, A) * G(u, k) * alpha_j(alpha, A))
        W[i][i] = np.zeros((n, n))

    return W

def alpha_j(a, A):
    alph = np.array([[0,0,0],[0,0,0],[0,0,0]],complex)
    rho = np.random.rand(3,1)
    for i in range(0, 2):
        for j in range(0, 2):
            alph[i][j] = (rho[i] * a * A[i][j])
    return alph

#-------------------------------------------------------------------

x1 = np.array([[1], [2], [0]])
y1 = np.array([[4], [5], [0]])

# SYSTEM PARAMETERS

# incoming Wave angle
theta = 0 # can range from [0, 2pi)

# susceptibility
chi = 10 + 1j

# wavelength
lam = 0.5 # microns (values between .4-.7)

# frequency
k = (2 * np.pi)/lam # 1/microns

# volume
V_0 = (0.05)**3 # microns^3

# incoming wave vector
K = k * np.array([[0], [np.sin(theta)], [np.cos(theta)]])

# polarization vector
vecinc = np.array([[1], [0], [0]]) # (can choose any vector perpendicular to K)

# for the fixed alpha case
alpha = (V_0 * 3 * chi)/(chi + 3)

# 3 x 3 matrix
A = np.matlib.identity(3) # could be any symmetric matrix, 


#-------------------------------------------------------------------

# TEST FUNCTIONS

test = G((x1-y1), k)
print(test)

w = W(x1, y1, k, alpha, A)
print(w)

Иногда мои циклы W выдают ошибку «невозможно установить элемент массива с последовательностью». Но мне нужно установить каждый элемент массива в этой произвольной матрице W на матрицу 3x3, созданную умножением альфы на G ...

1 Ответ

0 голосов
/ 26 мая 2019

На ваш вопрос о том, как создать новый массив с блоком для каждого элемента, нужно сделать следующее:

G = np.random.random([3,3])
result = np.zeros([9,9])
num_blocks = 3
a = np.random.random([3,3])
b = np.random.random([3,3])
for i in range(G.shape[0]):
    for j in range(G.shape[1]):
        block_result = a*G[i,j]*b
        for k in range(num_blocks):
            for l in range(num_blocks):
                result[3*i + k, 3*j + l] = block_result[i, j]

Вы должны быть в состоянии обобщить оттуда. Надеюсь, я правильно понял.

РЕДАКТИРОВАТЬ: Похоже, я не правильно понял. Я оставляю это в надежде, что это подтолкнет вас к ответу. Общая идея состоит в том, чтобы генерировать диапазоны индексов для работы, а затем просто работать с ними напрямую. Нарезка тоже может быть полезна.

Ах, вы спросили, как создать диагональ, заполненную блоками. В этом случае:

num_diagonal_blocks = 3 # for example

for block_dim in range(num_diagonal_blocks)
    # do your block calculation...
    for k in range(G.shape[0]):
        for l in range(G.shape[1]):
            result[3*block_dim + k, 3*block_dim + l] = # assign to element of block

Я думаю, что это почти всё.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...