#python #algorithm #dot-product
#python #алгоритм #скалярное произведение
Вопрос:
Я выполняю следующее скалярное произведение двух 3D векторов:
import numpy as np
Nk = 8
Ns = 15
k_box = np.zeros(Nk**3)
R_box = np.zeros(Ns**3)
for k in range(Nk**3):
Kx = int(k / (Nk*Nk))
Ky = int(k / Nk) % Nk
Kz = k % Nk
for R in range(Ns**3):
Rx = int(R / (Ns*Ns))
Ry = int(R / Ns) % Ns
Rz = R % Ns
# This is the only place these variables are used!
dot_product = Rx*Kx Ry*Ky Rz*Kz
k_box[k], R_box[R] = perform_some_calculation(dot_product)
Есть ли способ вычислить скалярное произведение без предварительного вычисления x, y, z
компонентов явно? Преобразование этого в 6 циклов сработало бы, но выглядело бы грубо. Похоже, что для этого был бы трюк.
Возможно, мне также потребуется расширить это до некубических объемов, поэтому, если есть трюк, и он работает для общей геометрии коробки, это было бы идеально.
Комментарии:
1. Ваш код не имеет смысла, поскольку ваш внутренний цикл просто повторно пересчитывает значение
value
— каждый раз другое значение, но где-либо сохраняется только последнее. Есть ли где-нибудь массив, или список, или кортеж, или простой контейнер данных? Пожалуйста, объясните свой вопрос более четко.2. Да, я отредактирую код, чтобы было более понятно, что я делаю. Я просто пытался включить только соответствующие части.
3. @ColinB: Есть какая-то конкретная причина, по которой вы преобразуете свои арифметические результаты в целые числа (используя
int()
)? будет ли все в порядке, если я буду использовать их в качестве значений с плавающей запятой?4. @ColinB: Ваш вопрос таков: «Есть ли способ вычислить скалярное произведение без предварительного вычисления компонентов x, y, z явно? «. Если это действительно ваш вопрос, то это не в моей компетенции, и я могу только (неуверенно) указать вам на альтернативное определение точечного произведения (произведение величин векторов и косинуса угла между ними). Но если ваш вопрос касается уменьшения количества видимых циклов, я могу предложить какое-то решение. Пожалуйста, уточните.
Ответ №1:
Скалярное произведение должно быть выполнено следующим образом
import numpy as np
R = np.array([Rx,Ry,Rz])
K = np.array([Kx,Ky,Kz])
value = np.dot(R,K)
Комментарии:
1. Это не отвечает на мой вопрос.
2. что делает последняя строка внутри цикла for?