2017-09-03 5 views
-1

다음 코드는 파이썬 3.6.1에서 성공적인 매트릭스를 만들기위한 시도입니다. 보시다시피, 저는 알파와 브라보 행렬을 할당 받았고, 알파와 브라보 행렬을 곱한 결과로 채워진 Charlie 행렬 (리스트)을 생성하도록 코드를 원합니다. 내 문제는 모듈을 실행할 때 c가 정의되어 있지 않다는 것이다. 내가 a 또는 b를 요청하면 동일합니다. 프로 팁 또는 포인터 누구? 고맙습니다.파이썬 매트릭스 코드 변수가 할당되지 않음을 나타냅니다

import math 

def matrix(a, b, c): 
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
    b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]] 
    c = [[], [], []] 
    for c in matrix: 
     c[1][1] = a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1] 
     c[1][2] = a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2] 
     c[1][3] = a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3] 
     c[2][1] = a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1] 
     c[2][2] = a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2] 
     c[2][3] = a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3] 
     c[3][1] = a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1] 
     c[3][2] = a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2] 
     c[3][3] = a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3] 
    return c 

답변

1

코드에 여러 가지 문제가 있습니다. 한 번에 하나씩 살펴 봅시다.

  1. 파이썬은 인덱스가 없습니다. 파이썬에서 배열이나리스트에 접근 할 때 첫 번째 요소는 0이고, 두 번째 요소는 1입니다. 당신은 그래서 존재하지 않기 때문에 a[3][...] 작동하지 않습니다 접근

    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
    

a을 정의했다. a[0][1, 2, 3] 등입니다.

  1. 빈 컨테이너에는 색인이 없습니다.c을 정의 할 때 빈 목록 목록을 정의했습니다. c[0]에 보관 된 목록은 빈 목록 []입니다. 따라서 c[0][0]에 액세스하려고하면 0 번째 요소가 존재하지 않으므로 (참조 용 또는 지원 용) 작동하지 않습니다. 당신이 한 것처럼

그것은 동일합니다 : 당신이 내적을 수행하려면

x = [] 
# this will not work: 
x[0] = 1 

, 내가 NumPy와 패키지를 사용하는 것이 좋습니다 것입니다. 이 종류의 수학을 처리하도록 설계되었습니다.

import numpy as np 

c = np.dot(a, b) 
c 
# returns: 
array([[ 20, 28, 33], 
     [ 50, 64, 72], 
     [ 80, 100, 111]]) 

여기에 두 행렬의 내적을하는 순수한 파이썬 방법입니다. b을 변환하고 각 행렬에 대한 요소 곱의 합계를 생성합니다. 그것은 치수 검사를하지 않으므로 가장 짧은 계산 가능한 결과로 절단됩니다.

def matrix_dot(a, b): 
    # transpose b 
    bT = list(map(list, zip(*b))) 
    # generate the dot product 
    c = [[sum(xx*yy for xx,yy in zip(x,y)) for y in bT] for x in a] 
    return c 

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]] 

matrix_dot(a,b) 
# returns: 
[[20, 28, 33], 
[50, 64, 72], 
[80, 100, 111]] 
+0

제임스 감사합니다. 나는 그것이 존재한다는 것을 알게 된 지금 Numpy 모듈을 사용하고 있습니다. 그러나 Numpy와 같은 모듈을 사용하지 않기로 결정하고 위의 원래 코드에서와 같이 길이를 결정한 경우 : 인덱스 위치를 고정하면 작동할까요 (내가하지 않은 올바른 위치에서 시작) , 그리고 C 변수에 대한 자리 표시 자 값 (예 : [[0,0,0], [0, 0, 0], [0, 0, 0]] 대신에 빈리스트 목록) ? – Feverdreamer44

+0

네, 그게 효과가 있습니다. 색인에서 하드 코딩하는 것보다'c' 출력을 만드는 더 효율적인 방법이 있습니다. 방법을 보여주기 위해 내 대답을 수정합니다. – James

+0

정말 도움이 제임스 주셔서 감사합니다. 제공 한 코드의 표기법, 특히 내적 생성 방법을 설명 할 수 있습니까? 나는 xx와 yy의 사용법, 또는 왜 bT가 사용되는지 이해하지 못한다 : bT에서 y에 대한 xx * yy (zip (x, y)의 yy)) – Feverdreamer44