检查向量是否位于Sage中矩阵的列的子集的跨度中



我是Sage编程的新手。我有一个矩形的R*C矩阵(R行和C列),M的秩(可能)比R和C都小。我想检查目标向量T是否在M的列的子集的范围内。我在Sage中写了以下代码(我没有包括整个代码,因为我获得M和T的方法相当麻烦)。我只是想检查一下代码是否符合我的要求。

简单地说,这就是我的代码试图做的:M是我给定的矩阵,我首先检查T是否确实在M的列的跨度内(第一个if条件)。如果他们这样做了,我继续将M(有C列)修剪为矩阵M1,该矩阵正好对(M)多列进行排序(这是第一个while循环所做的)。之后,我继续逐个删除列,以检查其余列的跨度中是否包含T(这是第二个while循环)。在第二个while循环中,我首先从M2(本质上是M1的副本)中移除一列,并将此矩阵称为M3。至M3。我增大向量T并检查秩是否减小。由于T已经在M2的跨度内,秩([M2T])应该与秩(M2)相同。现在,通过删除列c并将T增加到M2不会降低秩,那么我知道生成T不需要c。这样,我只保留生成T所需的列。

它确实为我尝试的例子返回了正确的答案,但我将在一个矩阵上运行这段代码,该矩阵的条目大小变化很大(比如最大值大到20^20,最小值为1),通常矩阵的维数可能高达300。因此,计划在周末对几百个测试用例进行测试。如果你能告诉我是否有什么可疑/错误的地方,那真的会很有帮助——例如,我会遇到精度错误吗?我应该如何修改我的代码,使其适用于上面提到的所有值/范围?此外,如果有什么方法可以加快我的代码(或者用更短/更好的方式写同样的东西),我想知道。

R = 155
C= 167
T = vector(QQ, R)
M1 = matrix(ZZ, R, C)
M1 = M
C1 = C
i2 = 0
if rank(M.augment(T)) == rank(M):
print("The rank of M is")
print(rank(M))
while i2 < C1 :
if rank(M1.delete_columns([i2])) == rank(M1) :
M1 = M1.delete_columns([i2])   
C1 = C1 - 1
else :
i2 = i2+1
C2 = M1.ncols()
print("The number of columns in the trimmed down matrix M1 is")
print(C2)

i3 = 0
M2 = M1
print("The rank of M1 which is now also the rank of M2 is")
print(rank(M2))
while i3 < C2 :
M3 = M2.delete_columns([i3])
if rank(M3.augment(T)) < rank(M2) :
M2 = M3
C2 = C2 - 1
else :
i3 = i3 + 1
print("Rank of matrix M is")
print(M.rank())

如果我想使用Sage来确定向量T是否在由另一个矩阵M的列的某个子集构建的矩阵M1的图像中,我会这样做:

M1 = M.matrix_from_columns([list of indices of the columns to use])
T in M1.column_space()

或者每次使用while循环来修改M1,就像你所做的那样。(但我认为T in M1.column_space()应该比测试等级相等更好。)

相关内容

  • 没有找到相关文章

最新更新