$ \ beingroup $
Tôi muốn tìm ma trận xoay $ n $ kích thước tương ứng với vòng quay của một góc $ \ theta $ xung quanh không gian con $ [N-2] $-.
Có công thức ma trận xoay N chiều. [Xem phương trình $ 15 $]
$$ i+[n_2n_1^t-n_1n_2^t] \ sin [a]+[n_1n_1^t+n_2n_2^t] [\ cos [a] -1] $$
Trong đó $ n_1 $ và $ n_2 $ là $ n $ -dimensional orthogonal vectơ.
Bất cứ ai có thể giải thích làm thế nào tôi có thể sử dụng công thức này, với giá $ n = 6 $?
hỏi ngày 14 tháng 2 năm 2017 lúc 15:23Feb 14, 2017 at 15:23
$ \ endgroup $
$ \ beingroup $
Đây là một ứng dụng ví dụ sử dụng Python / Numpy:
import numpy as np
# input vectors
v1 = np.array[ [1,1,1,1,1,1] ]
v2 = np.array[ [2,3,4,5,6,7] ]
# Gram-Schmidt orthogonalization
n1 = v1 / np.linalg.norm[v1]
v2 = v2 - np.dot[n1,v2] * n1
n2 = v2 / np.linalg.norm[v2]
# rotation by pi/2
a = np.pi/2
I = np.identity[6]
R = I + [ np.outer[n2,n1] - np.outer[n1,n2] ] * np.sin[a] + [ np.outer[n1,n1] + np.outer[n2,n2] ] * [np.cos[a]-1]
# check result
print[ np.matmul[ R, n1 ] ]
print[ n2 ]
Xem kết quả ở đây.
Đã trả lời ngày 12 tháng 3 năm 2018 lúc 2:27Mar 12, 2018 at 2:27
$ \ endgroup $
$ \ beingroup $
Đây là một ứng dụng ví dụ sử dụng Python / Numpy:
Xem kết quả ở đây.
Đã trả lời ngày 12 tháng 3 năm 2018 lúc 2:27Feb 14, 2017 at 15:32
Phụ thuộc vào những gì bạn có theo ý của bạn để tính toán?H. H. Rugh
Nếu bạn có ngôn ngữ lập trình khoa học, như MATLAB, bạn sẽ xây dựng một ma trận thứ nguyên $ n \ lần n $ từ công thức trên. Ví dụ: tôi chỉ là danh tính, $ n_2 n_1^t $ là một ma trận thứ nguyên $ n \ lần n $ thu được bằng cách lấy sản phẩm của một vectơ cột với một vectơ hàng, v.v. theo góc $ a $ trong mặt phẳng được kéo dài bởi $ [n_1, n_2] $ và với định hướng được đưa ra bởi cặp vợ chồng đó.1 gold badge20 silver badges45 bronze badges
$ \ endgroup $
//math.stackexchange.com/questions/442418/random-generation-of-rotation-matrices
Điều này có thể trả lời câu hỏi của bạn, ít nhất là theo như chiến lược. Theo như tôi biết, không có chức năng tiêu chuẩn hoặc thư viện nào từ Numpy sẽ làm chính xác những gì bạn cần. Vô số chiến lược tính toán được trình bày ở đó, nhưng tôi thích một phần mở rộng của phương pháp Đệ tứ vì nó có thể bảo tồn phân phối thống nhất, đó là những gì tôi cho là bạn đang theo đuổi.
EDIT: Câu trả lời ban đầu của tôi đã nêu "sự đồng nhất gần như", trong khi sau khi nghiên cứu thêm một chút, tôi thấy rằng phương pháp bậc bốn, khi được lấy mẫu từ phân phối đồng đều, trên thực tế sẽ bảo tồn phân phối đồng đều trong các vòng quay.
@mdhaber: Tôi nghĩ sẽ rất thuận tiện khi có chức năng trợ giúp ở đâu đó
def rotation[n, dims, angle]: """ Parameters ------------ n : int dimension of the space dims : 2-tuple of ints the vector indices which form the plane to perform the rotation in angle : array_like of shape [M...,] broadcasting angle to rotate by Returns -------- m : array_like of shape [M..., n, n] [stack of] rotation matrix """ i, j = dims assert i != j c = np.cos[angle] s = np.sin[angle] arr = np.eye[c.shape + [n, n], dtype=c.dtype] arr[..., i, i] = c arr[..., i, j] = -s arr[..., j, i] = s arr[..., j, j] = c return arr
và có thể một số tay ngắn được xây dựng cho các mục đích sử dụng phổ biến
rotation_2d = functools.partial[rotation, 2, [0, 1]] rotation_3d = functools.partial[rotation, 3] rotation_3d_x = functools.partial[rotation_3d, [1, 2]] # yz-plane rotation_3d_y = functools.partial[rotation_3d, [2, 0]] # zx-plane rotation_3d_z = functools.partial[rotation_3d, [0, 1]] # xy-plane
Không có những tốc ký này, chúng ta vẫn có thể phục hồi:
- Xoay 2D,
rotation[angle, 2, [0, 1]]
- Xoay 3D:
- về mặt phẳng xy [trục z],
rotation[3, [0, 1], angle]
- về mặt phẳng yz [trục x],
rotation[3, [1, 2], angle]
- về mặt phẳng zx [trục y],
rotation[3, [2, 0], angle]
- về mặt phẳng xy [trục z],
- Vòng quay 4D:
- về mặt phẳng xy,
rotation[4, [0, 1], angle]
- ...
- về mặt phẳng xy,
Cảm giác này như nó sẽ phù hợp với scipy.spatial.transform
ở đâu đó, mặc dù cách viết ở trên có lẽ là một chút kinh ngạc.