Справка по матрицам - индекс 3 выходит за пределы оси 1 с размером 3, НО я почти уверен, что у меня есть матрица (3, n) - PullRequest
0 голосов
/ 04 августа 2020

Я продолжаю получать ошибку «индекс 3 выходит за пределы оси 1 с размером 3», но я уверен, что использую матрицу (3, n), а не (n, 3). Я не очень знаком с матрицами в python, поэтому я использовал своего рода хитрый способ придать им желаемую форму, чтобы я мог их умножать или складывать. Может ли кто-нибудь увидеть, где я ошибся, или предложить лучшую практику?

Я пытаюсь выполнить вращательное преобразование на A, сгенерированное через:

A = array(random.rand(3, 9));

, где A содержит a набор координат x, y, z в каждом столбце. Например:

   Matrix A:
 [[0.70799333 0.77123425 0.07271538 0.52498025 0.84353825 0.78331767
  0.06428417 0.25629863 0.6654734  0.77562903]
 [0.34179928 0.83233168 0.3920859  0.19819796 0.22486337 0.09274312
  0.49057914 0.69716143 0.613912   0.04940198]
 [0.98522559 0.71273242 0.70784866 0.61589377 0.34007973 0.34492078
  0.44491238 0.37423906 0.37427018 0.13558728]] 

преобразованная матрица вычисляется через A_translated = re_R. (Каждый столбец A) + ret_t, где

 ret_R:  
[[ 0.1928724   0.90776212  0.372516  ]
 [ 0.27931303 -0.41473028  0.8660156 ]
 [ 0.94062983 -0.06298194 -0.33353981]]

и

  ret_t:
[[0.93445859]
 [0.59949888]
 [0.77385835]] 

Моя попытка была следующей:

count = 0
num_rows, num_cols = A.shape
translated_A = pd.DataFrame( zeros( (num_rows, num_cols) ) )
print('Translated A: \n', translated_A)

for i in range(0, num_cols): 

    multiply = ret_R.A[:,i] # works up until (not including) i = 3
    #IndexError: index 3 is out of bounds for axis 1 with size 3
    print('Multiply: \n', multiply)
    multiply2 = np.matrix(pd.DataFrame(multiply))
    matrix = multiply2 + ret_t #works
    matrix2 = pd.DataFrame(matrix) #np.matrix(pd.DataFrame(matrix)) # not working ?
    print('Matrix:', matrix2)
    translated_A[i] = matrix2[0]
    
print(translated_A)

Строка multiply = ret_R.A [:, i] работает только до тех пор, пока i = 3, не включая i = 3, что предполагает, что моя матрица A равна n, 3, но I ' м уверен, что это 3, н. Я продолжал переключаться между матрицами и фреймами данных, так как это работало, но не работало после i = 2.

1 Ответ

0 голосов
/ 04 августа 2020

Я понял, что для правильного нахождения скалярного произведения матриц мне следует использовать '@', а не '.' и мне пришлось транспонировать multiply2, чтобы получить матрицу в виде [[] [] []]. Мне больше не нужно постоянно переключаться между фреймом данных и матрицей

...