2014-02-12 4 views
1

Есть ли максимальный размер, который может обрабатывать scipy.linalg.solve (numpy.linalg.solve)?Scipy.linalg.solve максимальный размер массива

Я работаю над переносом некоторой MatLab коде (некоторые Пуассоны изображения клонированию, который я не писал) в Python, и в Python У меня есть код:

print M.shape 
print b.shape 

x = scipy.linalg.solve(M,b) 

который держит возвращение выхода (и ошибка):

(2550, 2550) 
(2550, 1) 


Traceback (most recent call last): 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\test_runner.py", line 19, in <module> 
    ibgFaceManipulator.main(testOut,pathName,ptsFile,subjectId,'2','0') 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\ibgFaceManipulator.py", line 70, in main 
    ManipulateFaceWrapper.main(outDir,subjectId,retry,attempts,listchoice,NewImageData,AllBlend,Patchizer) 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\ManipulateFaceWrapper.py", line 31, in main 
    ManipulateFace.main(outdir,newImageData,3,filename,patchizer,blendParam,eyeDistortionParams,mouthDistortionParams,[]) 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\ManipulateFace.py", line 38, in main 
    FaceTex = PatchOverFaceWithSelectionPre.main(TexLib,FaceTex,OperationMaskNew,M,0) 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\PatchOverFaceWithSelectionPre.py", line 104, in main 
    tex = poissonImageCloneColor.main(tex,source_tex,imgProc.imerode(imMask,imgProc.strel('disk',1))) 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\poissonImageCloneColor.py", line 22, in main 
    imr = poissonImageClone.main(imir, imr,imMask) 
    File "D:\Other\WB_Lab\PythonPort\FaceManip\Code\poissonImageClone.py", line 81, in main 
    x = scipy.linalg.solve(np.squeeze(M),b) 
    File "C:\Python27\lib\site-packages\scipy\linalg\basic.py", line 78, in solve 
    raise ValueError('expected square matrix') 
ValueError: expected square matrix 

Но я точно знаю, что M является квадратным (размер). Оба M и b имеют тип dtype float64, а M - это отформатированная матрица csc.

С кем-либо видели подобные ошибки раньше?

Я нашел, что numpy.linalg.cond(M) также терпит неудачу. На этот раз, говоря, что матрица M является 0-мерной (это та же ошибка numpy.linalg.solve дает мне).

+0

Можете ли вы напечатать 'тип' и' dtype' 'M' и показать полную трассировку? – user2357112

+0

На самом деле, вы можете показать [пример минимального запуска, демонстрирующий ошибку при запуске] (http://stackoverflow.com/help/mcve)? – user2357112

+0

Оба M и b имеют dtype float64, а M - это отформатированная матрица csc. Я буду работать над созданием минимального примерного примера, но, как и код, это может быть сложно. – wbest

ответ

2

Я сделал еще несколько исследований и обнаружил, что разреженные матрицы (которые я использую) на самом деле являются особым случаем. У Scipy есть другая функция решения для них scipy.sparse.linalg.spsolve. Используя это, я смог решить уравнение и получить результаты.

0

Хммм ... Интересно. Мой дал правильный результат. Не могли бы вы попробуете простую матрицу, например:

import numpy as np 
from scipy.linalg import solve 
M = np.eye(5) 
b = np.ones(5) 
solve(M, b) 

, чтобы узнать, остается ли проблема до сих пор? А также, какая версия вашего scipy?

+0

Да, маленькие матрицы, похоже, работают, но мне интересно, есть ли максимальный рабочий размер, или если есть что-то особенное, что мне нужно сделать для решения очень больших матриц. – wbest

+0

@wbest Я пробовал большой размер, но он тоже работал ... Я использовал M = np.random.rand (2550, 2550); b = np.random.rand (2550, 1); решить (M, b), но он работал и на моем. Какую версию scipy вы используете? –

+0

это интересно. Выполнение этого работает, поэтому я предполагаю, что это, по крайней мере, доказательство того, что он должен обрабатывать матрицы такого размера. Я использую версию 1.8.0. – wbest

Смежные вопросы