16 for (
unsigned int r=0; r<
m; ++r)
18 unsigned int c=0;
while (c<n && a[r][c] != 1 && a[r][c] != -1) ++c;
20 for (
unsigned int s=0; s<
m; ++s)
22 if (s==r || a[s][c] == 0)
continue;
23 for (
unsigned int d=0; d<n; ++d)
24 if (d!=c) a[s][d] -= a[r][d] * a[r][c] * a[s][c];
35 for (
unsigned int r=0; r<
m; ++r)
37 unsigned int c=0;
while (c<n && a[r][c] == 0) ++c;
39 for (
unsigned int s=0; s<
m; ++s)
42 T scale = a[s][c] / a[r][c];
45 if (scale == 0)
continue;
46 for (
unsigned int d=0; d<n; ++d)
47 if (d!=c) a[s][d] -= a[r][d] * scale;
48 a[s][c] -= a[r][c] * scale;
65 for (
unsigned int c=0; c<n; ++c)
67 unsigned int r=0;
while (r<
m && a[r][c] != 1 && a[r][c] != -1) ++r;
69 for (
unsigned int d=0; d<n; ++d)
71 if (d==c || a[r][d] == 0)
continue;
72 for (
unsigned int s=0; s<
m; ++s)
73 if (s!=r) a[s][d] -= a[s][c] * a[r][c] * a[r][d];
84 for (
unsigned int c=0; c<n; ++c)
86 unsigned int r=0;
while (r<
m && a[r][c] == 0) ++r;
88 for (
unsigned int d=0; d<n; ++d)
91 T scale = a[r][d] / a[r][c];
94 if (scale == 0)
continue;
95 for (
unsigned int s=0; s<
m; ++s)
96 if (s!=r) a[s][d] -= a[s][c] * scale;
97 a[r][d] -= a[r][c] * scale;
114 for (
unsigned int r=0; r<
m; ++r)
116 unsigned int c=0;
while (c<n && a[r][c] != 1 && a[r][c] != -1) ++c;
118 for (
unsigned int s=0; s<
m; ++s)
120 if (s==r || a[s][c] == 0)
continue;
121 for (
unsigned int d=0; d<n; ++d)
122 if (d!=c) a[s][d] -= a[r][d] * a[r][c] * a[s][c];
127 for (
unsigned int c=0; c<n; ++c)
129 unsigned int r=0;
while (r<
m && a[r][c] != 1 && a[r][c] != -1) ++r;
131 for (
unsigned int d=0; d<n; ++d)
133 if (d==c || a[r][d] == 0)
continue;
134 for (
unsigned int s=0; s<
m; ++s)
135 if (s!=r) a[s][d] -= a[s][c] * a[r][c] * a[r][d];
146 for (
unsigned int r=0; r<
m; ++r)
148 unsigned int c=0;
while (c<n && a[r][c] == 0) ++c;
150 for (
unsigned int s=0; s<
m; ++s)
153 T scale = a[s][c] / a[r][c];
156 if (scale == 0)
continue;
157 for (
unsigned int d=0; d<n; ++d)
158 if (d!=c) a[s][d] -= a[r][d] * scale;
159 a[s][c] -= a[r][c] * scale;
163 for (
unsigned int c=0; c<n; ++c)
165 unsigned int r=0;
while (r<
m && a[r][c] == 0) ++r;
167 for (
unsigned int d=0; d<n; ++d)
170 T scale = a[r][d] / a[r][c];
173 if (scale == 0)
continue;
174 for (
unsigned int s=0; s<
m; ++s)
175 if (s!=r) a[s][d] -= a[s][c] * scale;
176 a[r][d] -= a[r][c] * scale;
187 unsigned int rank = 0;
191 for (
unsigned int r=0; r<a.
rows(); ++r)
194 while (c<a.
columns() && a[r][c] == 0) ++c;
202 for (
unsigned int c=0; c<a.
columns(); ++c)
205 while (r<a.
rows() && a[r][c] == 0) ++r;
206 if (r!=a.
rows()) ++rank;
212 #undef VNL_RANK_INSTANTIATE 213 #define VNL_RANK_INSTANTIATE(T) \ 214 template VNL_EXPORT vnl_matrix<T > vnl_rank_row_reduce(vnl_matrix<T > const&, vnl_rank_pivot_type);\ 215 template VNL_EXPORT vnl_matrix<T > vnl_rank_column_reduce(vnl_matrix<T > const&, vnl_rank_pivot_type);\ 216 template VNL_EXPORT vnl_matrix<T > vnl_rank_row_column_reduce(vnl_matrix<T > const&, vnl_rank_pivot_type);\ 217 template VNL_EXPORT unsigned int vnl_rank(vnl_matrix<T > const&, vnl_rank_type) 219 #endif // vnl_rank_hxx_ Direct computation of the rank of a matrix, without using svd.
VNL_EXPORT vnl_matrix< T > vnl_rank_row_reduce(vnl_matrix< T > const &mat, vnl_rank_pivot_type=vnl_rank_pivot_all)
Row reduce a matrix.
VNL_EXPORT vnl_matrix< T > vnl_rank_column_reduce(vnl_matrix< T > const &mat, vnl_rank_pivot_type=vnl_rank_pivot_all)
Column reduce a matrix.
An ordinary mathematical matrix.
unsigned int rows() const
Return the number of rows.
VNL_EXPORT unsigned int vnl_rank(vnl_matrix< T > const &mat, vnl_rank_type=vnl_rank_both)
Returns the rank of a matrix.
VNL_EXPORT vnl_matrix< T > vnl_rank_row_column_reduce(vnl_matrix< T > const &mat, vnl_rank_pivot_type=vnl_rank_pivot_all)
Row and column reduce a matrix.
unsigned int columns() const
Return the number of columns.