2015-06-05 5 views
1
Lowest cost through this matrix: 
Traceback (most recent call last): 
    File "muncre.py", line 8, in <module> 
     print_matrix(matrix, msg='Lowest cost through this matrix:') 
    File "/usr/lib/python2.7/dist-packages/munkres.py", line 730, in print_matrix 
     width = max(width, int(math.log10(val)) + 1) 
ValueError: math domain error 

Когда матрица содержит нуль в любой из строк, выдается вышеуказанная ошибка. Как я могу это исправить?print_matrix библиотеки munkres python генерирует исключение в матрице, содержащей нули

Это кусок кода в Python:

from munkres import Munkres, print_matrix 
matrix = [[6, 9, 1], 
      [10, 9, 2], 
      [0,8,7]] 
m = Munkres() 
indexes = m.compute(matrix) 
print_matrix(matrix, msg='Lowest cost through this matrix:') 
total = 0 
for row, column in indexes: 
    value = matrix[row][column] 
    total += value 
    print '(%d, %d) -> %d' % (row, column, value) 
print 'total cost: %d' % total 

Я установил библиотеку Манкрес с помощью следующей команды в Ubuntu:

Суд APT-получить установку питона-Манкрес

+1

Вы можете обеспечить [MCVE] (http://stackoverflow.com/help/mcve) – tom

+0

я дал матрицу значений [[6 91] [10 9 2] [0 8 7]]. В случае любой матрицы, такой как эта форма, которая содержит 0 в любой из строк, muncres бросает ошибку Value. Я не мог получить роль ширины в коде библиотеки. Итак, как решить это? – bambi

+0

Правильно, но вы прочитали страницу, с которой я связался? «Когда вы задаете вопрос о проблеме, вызванной вашим кодом, вы получите гораздо лучшие ответы, если вы предоставите код, который люди могут использовать для воспроизведения проблемы» – tom

ответ

0

Это действительно похоже на ошибку с библиотекой munkres. Print_matrix - это просто «удобная» функция, и я предлагаю подать отчет об ошибке и в промежуточный момент просто заменить его на что-то вроде следующего (это всего лишь их код с исправлением, чтобы не пытаться применить 0 или отрицательные числа к логарифм). То, что пытались сделать, - это сделать так, чтобы каждый столбец был наибольшей шириной для числа. Обратите внимание, что если вы передадите отрицательные числа, у этого может быть проблема с 1 вопросом, но, с другой стороны, если у вас есть отрицательные затраты, у вас могут возникнуть большие проблемы.

def print_matrix(matrix, msg=None): 
    """ 
    Convenience function: Displays the contents of a matrix of integers. 
    :Parameters: 
     matrix : list of lists 
      Matrix to print 
     msg : str 
      Optional message to print before displaying the matrix 
    """ 
    import math 

    if msg is not None: 
     print(msg) 

    # Calculate the appropriate format width. 
    width = 1 
    for row in matrix: 
     for val in row: 
      if abs(val) > 1: 
       width = max(width, int(math.log10(abs(val))) + 1) 

    # Make the format string 
    format = '%%%dd' % width 

    # Print the matrix 
    for row in matrix: 
     sep = '[' 
     for val in row: 
      sys.stdout.write(sep + format % val) 
      sep = ', ' 
     sys.stdout.write(']\n')