Member 11807654 Ответов: 1

Почему существует разница между выводом собственной библиотеки и тем, что было задокументировано?


Здравствуйте, я написал следующую программу с библиотеками igraph и eigen и хочу вычислить наибольшее собственное значение матрицы смежности графа. проблема заключается в том, что результирующее собственное значение набора данных polbooks равно 23.8653, а то, что было написано в статьях, - 11.93. в чем разница между этими двумя числами? Я использовал этот пример в GitHub - yixuan/arpack-eigen: редизайн ARPACK только для заголовка C++ с использованием библиотеки Eigen[^]
igraph_matrix_t  res;
	igraph_matrix_init(&res,igraph_vcount(&g),igraph_vcount(&g));

	igraph_get_adjacency(&g,&res,IGRAPH_GET_ADJACENCY_BOTH, false);

	Eigen::MatrixXd M(res.nrow,res.ncol);

	for(int i=0;i<res.nrow;i++)
		for(int j=0;j<res.ncol;j++)
		{
			M(i,j)=MATRIX(res,i,j);
			
		}
	
	DenseSymMatProd<double> op(M);
	
	SymEigsSolver< double, LARGEST_ALGE, DenseSymMatProd<double> > eigs1(&op, 1, 4);
	
	eigs1.init();
	int nconv = eigs1.compute();

	Eigen::VectorXd evalues;
	if(eigs1.info() == SUCCESSFUL)
		evalues = eigs1.eigenvalues();

	std::cout << "largest Eigenvalue: " << evalues << std::endl;


Что я уже пробовал:

Я не знаю, в чем проблема с моей программой. пожалуйста, помогите мне. спасибо

1 Ответов

Рейтинг:
2

OriginalGriff

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

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку и запустите приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!