我编写了一个高斯消除版本来验证一组二元向量的线性独立性。它输入一个矩阵(mxn)来评估并返回:
它似乎总是很好,或者至少差不多。我发现当矩阵在最后一行有两个重复的向量时,它不起作用:
For i = 0 To lastArrayIndex
thisString = columnsDataInThisLine(i)
theFirstStringSymbol = Left(thisString, 1)
If theFirstStringSymbol = """" Then
'Replace double double quotes in the string beginning and _
'the end into single double quotes
thisString = Mid(thisString, 2, Len(thisString) - 2)
End If
columnsDataInThisLine(i) = thisString
Next i
该函数表示矩阵是"线性无关"因为没有找到零行,结果确实存在任何行。但是调试我发现在某个时刻某行变为零,但在一些行操作之后,它会回到"正常&# 34。
我仔细检查了代码,使其工作的唯一方法是返回" false"当一个"零行"在>>过程结束之前,更准确地说,在行操作期间找到:
std::vector<std::vector<int>> A = {
{1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1 },
{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0 },
{0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0 },
{0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0}, // <---- duplicated
{0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0},}; // <---- duplicated
gaussianElimination_binary(A);
我想知道这是否正确,或者我是否只是修补&#34;一个糟糕的代码。
谢谢!
以下full code:
// perform XOR in "k-th" row against "row-th" row
for (int k = 0; k <= max_row; ++k) //k=col_pivot?
{
if ( (k != row) )
{
int check_zero_row = 0; // <---- APPLIED PATCH
for (std::size_t j = 0; j <= max_col; j++) {
B[k][j] = B[k][j] ^ B[row][j];
check_zero_row = check_zero_row | B[k][j];
}
if (check_zero_row == 0 ) // <---- APPLIED PATCH
{
return false;
}
}
}