Собственная библиотека - EigenSolver получает другое собственное значение по сравнению с функцией Matlab eig [duplicate]

В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

3
задан F1sher 15 May 2015 в 01:21
поделиться

2 ответа

Здесь нет проблемы с Eigen.

На самом деле для второго примера выполнения Matlab и Eigen дали тот же результат. Пожалуйста, запомните из основной линейной алгебры, что собственный вектор определяется с точностью до произвольного масштабного коэффициента. (Т. Е. Если v является собственным вектором, то то же самое справедливо для альфа * v, где альфа является ненулевым комплексным скаляром.)

. Обычно библиотеки различных линейных алгебр вычисляют разные собственные векторы, но это не означает что один из двух кодов ошибочен: это просто означает, что они выбирают другое масштабирование собственных векторов.

EDIT

Основная проблема с точным воспроизведением масштабирования, выбранного Matlab, заключается в том, что eig(A,B) - это драйвер , который в зависимости от разных свойств A и B может вызывать разные библиотеки / подпрограммы и применять дополнительные шаги, такие как балансировка матриц и т. д. Быстро проверив ваш пример, я бы сказал, что в этом случае Matlab выполняет следующее условие:

  • all(imag(V(end,:))==0) (последний компонент каждого собственного вектора вещественный)

, но не налагая других ограничений. Это, к сожалению, означает, что масштабирование не является уникальным и, вероятно, зависит от промежуточных результатов алгоритма обобщенного собственного вектора. В этом случае я не могу дать вам совет о том, как точно реплицировать matlab: требуется знание внутренней работы matlab.

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

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

2
ответ дан Stefano M 28 August 2018 в 22:04
поделиться

Масштабирование собственных векторов в Matlab, по-видимому, основано на их нормализации до 1,0 (т. е. абсолютное значение наибольшего члена в каждом векторе равно 1,0). В приложении, которое я использовал, он также возвращает левый собственный вектор, а не более часто используемый правильный собственный вектор. Это может объяснить различия между Matlab и eigensolvers в Lapack MKL.

0
ответ дан Schulzey 28 August 2018 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: