Когда следующая строка выполняется как часть цикла parfor, она выполняется, даже если матрица G плохо обусловлена.Mldivide в параллельном пакете
betas = G\data.y2.';
Однако, когда я пытаюсь запустить его как часть регулярного для цикла код прекращает выполнение и сообщает, что матрица вырождена.
Зачем обрабатывать петли for и parfor по-разному?
Причина, по которой я прошу, заключается в том, что я отлаживаю код, который кто-то написал. Я не могу отлаживать парфор, поэтому я надеялся выяснить, что происходит, глядя на эквивалент.
Есть ли способ отлаживать параллельный код, где я могу ожидать, что код будет вести себя так же, как в параллельной среде?
Также что делает data.y2.
; в отличие от data.y2'
;
Кроме того, у меня есть более старая версия кода, предназначенная для запуска в обычном цикле.
Когда я вернулся, чтобы запустить, я получил ту же ошибку, которая остановила работу кода.
Однако, когда я перезапустил MATLAB и снова запустил его, у него не было проблем. Он просто принимает результат инвертирования сингулярной матрицы NaN
и продолжает (именно это я и хочу).
В параллельной версии следующие заявления делаются:
warnState(1) = warning('error', 'MATLAB:singularMatrix');
warnState(2) = warning('error', 'MATLAB:illConditionedMatrix');
ли это то, что вызывает код, чтобы остановить? Если да, то почему они не влияют на параллельную версию?