2013-04-09 6 views
0

Когда следующая строка выполняется как часть цикла 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'); 

ли это то, что вызывает код, чтобы остановить? Если да, то почему они не влияют на параллельную версию?

ответ

1

Одно из отличий обычного рабочего стола от MATLAB и Parallel Computing Toolbox заключается в том, что рабочий стол MATLAB работает многопоточно, а рабочие запускаются в режиме одиночных вычислительных потоков. Я считаю, что это может привести к небольшим числовым расхождениям. Вы можете попробовать запускать свой рабочий стол MATLAB, используя

matlab -singleCompThread 

, чтобы увидеть, если регулярный MATLAB может демонстрировать такое же поведение.

В MATLAB, оператор .' является TRANSPOSE и ' является CTRANSPOSE - комплексно сопряженное транспонирование.

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