Каковы элементы вектора поворота в устранении Гаусса-Иордана
В числовых рецептах на стр. 39 (стр. 4 в pdf) был предложен следующий алгоритм для нахождения стержня:
void gaussj(float **a, int n, float **b, int m)
/* Linear equation solution by Gauss-Jordan elimination,
equation (2.1.1) above. a[1..n][1..n] is the input matrix.
b[1..n][1..m] is input containing the m right-hand side vectors.
On output, a is replaced by its matrix inverse, and b is
replaced by the corresponding set of solution vectors. */
{
int *indxc,*indxr,*ipiv;
int i,icol,irow,j,k,l,ll;
float big,dum,pivinv,temp;
indxc=ivector(1,n); indxr=ivector(1,n); ipiv=ivector(1,n);
/* The integer arrays ipiv, indxr, and indxc are used for
bookkeeping on the pivoting. */
for (j=1;j<=n;j++) ipiv[j]=0;
// This is the main loop over the columns to be reduced.
for (i=1;i<=n;i++) {
big=0.0;
// The following is the outer loop of the
// search for a pivot element.
for (j=1;j<=n;j++)
if (ipiv[j] != 1)
for (k=1;k<=n;k++) {
if (ipiv[k] == 0) {
if (abs(a[j][k]) >= big) {
big=abs(a[j][k]);
irow=j;
icol=k;
}
}
}
++(ipiv[icol]);
// ... THE REST OF THE CODE ... (complete code in the link)
Я не понимаю, почему в какой-то момент мы имеем ipiv[j] != 1
и двумя строками позже ipiv[k] == 0
, И тогда в конце элемент вектора увеличивается. Какова семантика этого вектора?
Просто, чтобы расширить это, есть ли причина, по которой одна строка сравнивает элемент ipiv
в 1
и через две строки он сравнивается с 0
, Кроме того, последняя строка увеличивает элемент, а не просто устанавливает его в 1
, Так что это просто отсутствие последовательности и стиля при написании кода, или элемент ipiv может принимать значения, отличные от 0
а также 1
?
Примечание: я ранее разместил этот вопрос в math.stackexchange здесь. После обмена несколькими комментариями, я чувствую, что это больше относится здесь.