|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 bh4qix 于 2024-12-15 21:50 编辑
从一个大程序里摘录出来的 C 代码,然后高度简化,再翻译成 C#
结果不同,请高手指点!多谢!
main()
{
double **a, **a_inv;
double big, pivot_inverse, temp, abs_element;
int *pivot_flag, *swap_col, *swap_row;
int i, j, n, row, col, swap, irow, icol;
n = 3;
a = (double **)calloc(n, 4);
for (i = 0; i < n; i++)
{
a = (double *)calloc(n, sizeof(double));
}
a[0][0] = -1; a[0][1] = 2; a[0][2] = 1;
a[1][0] = -2; a[1][1] = 2; a[1][2] = 1;
a[2][0] = -1; a[2][1] = 2; a[2][2] = 3;
printf("\nA matrix:");
for (i = 0; i < n; i++)
{
printf("\nRow%3d:", i);
for (j = 0; j < n; j++)
{
printf("%14.5lg", a[j]);
}
}
/*--------------*/
a_inv = (double **)calloc(n, 4);
for (i = 0; i < n; i++)
{
a_inv = (double *)calloc(n, sizeof(double));
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
a_inv[j] = a[j];
}
}
pivot_flag = (int *)calloc(n, sizeof(int));
swap_row = (int *)calloc(n, sizeof(int));
swap_col = (int *)calloc(n, sizeof(int));
for (i = 0; i < n; i++)
{
big = 0.0;
for (row = 0; row < n; row++) {
if (!pivot_flag[row])
{
for (col = 0; col < n; col++)
{
if (!pivot_flag[col])
{
abs_element = fabs(a_inv[row][col]);
if (abs_element >= big)
{
big = abs_element;
irow = row;
icol = col;
}
}
}
}
}
pivot_flag[icol]++;
if (irow != icol)
{
for (col = 0; col < n; col++)
{
temp = a_inv[irow][col];
a_inv[irow][col] = a_inv[icol][col];
a_inv[icol][col] = temp;
}
}
swap_row = irow;
swap_col = icol;
pivot_inverse = 1.0 / a_inv[icol][icol];
a_inv[icol][icol] = 1.0;
for (col = 0; col < n; col++)
a_inv[icol][col] = a_inv[icol][col] * pivot_inverse;
for (row = 0; row < n; row++)
{
if (row != icol)
{
temp = a_inv[row][icol];
a_inv[row][icol] = 0.0;
for (col = 0; col < n; col++)
a_inv[row][col] = a_inv[row][col] - a_inv[icol][col] * temp;
}
}
}
for (swap = n - 1; swap >= 0; swap--)
{
if (swap_row[swap] != swap_col[swap])
{
for (row = 0; row < n; row++)
{
temp = a_inv[row][swap_row[swap]];
a_inv[row][swap_row[swap]] = a_inv[row][swap_col[swap]];
a_inv[row][swap_col[swap]] = temp;
}
}
}
free((char *)pivot_flag);
free((char *)swap_row);
free((char *)swap_col);
/*-------------*/
printf("\n\nA matrix inverse (Ai):");
for (i = 0; i < n; i++)
{
printf("\nRow%3d:", i);
for (j = 0; j < n; j++)
{
printf("%14.5lg", a_inv[j]);
}
}
printf("\n\n");
}
===========================================================================
private void Button_Click(object sender, RoutedEventArgs e)
{
var sb = new StringBuilder();
var n = 3;
var a = new double[n, n];
var a_inv = new double[n, n];
double big, pivot_inverse, temp, abs_element;
var pivot_flag = new int[n];
var swap_col = new int[n];
var swap_row = new int[n]; ;
var irow = 0;
var icol = 0;
a[0, 0] = -1; a[0, 1] = 2; a[0, 2] = 1;
a[1, 0] = -2; a[1, 1] = 2; a[1, 2] = 1;
a[2, 0] = -1; a[2, 1] = 2; a[2, 2] = 3;
sb.Append("\nA matrix:");
for (int i = 0; i < n; i++)
{
sb.Append("\nRow ").Append(i.ToString()).Append("\t");
for (int j = 0; j < n; j++)
{
sb.Append(a[i, j].ToString()).Append("\t");
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a_inv[i, j] = a[i, j];
}
}
for (int i = 0; i < n; i++)
{
big = 0.0;
for (int row = 0; row < n; row++)
{
if (pivot_flag[row] != 0)
{
for (int col = 0; col < n; col++)
{
if (pivot_flag[col] != 0)
{
abs_element = Math.Abs(a_inv[row, col]);
if (abs_element >= big)
{
big = abs_element;
irow = row;
icol = col;
}
}
}
}
}
pivot_flag[icol]++;
if (irow != icol)
{
for (int col = 0; col < n; col++)
{
temp = a_inv[irow, col];
a_inv[irow, col] = a_inv[icol, col];
a_inv[icol, col] = temp;
}
}
swap_row = irow;
swap_col = icol;
pivot_inverse = 1.0 / a_inv[icol, icol];
a_inv[icol, icol] = 1.0;
for (int col = 0; col < n; col++)
a_inv[icol, col] = a_inv[icol, col] * pivot_inverse;
for (int row = 0; row < n; row++)
{
if (row != icol)
{
temp = a_inv[row, icol];
a_inv[row, icol] = 0.0;
for (int col = 0; col < n; col++)
a_inv[row, col] = a_inv[row, col] - a_inv[icol, col] * temp;
}
}
}
for (int swap = n - 1; swap >= 0; swap--)
{
if (swap_row[swap] != swap_col[swap])
{
for (int row = 0; row < n; row++)
{
temp = a_inv[row, swap_row[swap]];
a_inv[row, swap_row[swap]] = a_inv[row, swap_col[swap]];
a_inv[row, swap_col[swap]] = temp;
}
}
}
sb.Append("\n\nA matrix inverse (Ai):");
for (int i = 0; i < n; i++)
{
sb.Append("\nRow:").Append(i.ToString()).Append("\t");
for (int j = 0; j < n; j++)
{
sb.Append(a_inv[i, j]).Append("\t");
}
}
sb.Append("\n\n");
MessageBox.Show(sb.ToString());
}
补充内容 (2024-12-18 21:25):
封贴,谢谢 |
|