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

Matrix 检查向量是否位于Sage中矩阵列的跨度a子集中,matrix,linear-algebra,sage,Matrix,Linear Algebra,Sage,我是Sage编程新手。我有一个矩形的R*C矩阵(R行和C列),M的秩(可能)比R和C都小。我想检查目标向量T是否在M的一个子集的范围内。我用Sage编写了以下代码(我没有包括全部代码,因为我得到M和T的方法相当麻烦)。我只是想检查代码是否符合我的要求 简单地说,这就是我的代码试图做的:M是我给定的矩阵,我首先检查T是否确实在M的列范围内(第一个if条件)。如果他们这样做了,我继续将M(其中有C列)缩减为一个矩阵M1,该矩阵正好有秩(M)多个列(这是第一个while循环所做的)。之后,我继续逐个删

我是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。至立方米。我增加向量T并检查秩是否减少。由于T已经在M2的范围内,秩([M2 T])应该与秩(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())
R=155
C=167
T=向量(QQ,R)
M1=矩阵(ZZ,R,C)
M1=M
C1=C
i2=0
如果秩(M.augment(T))==秩(M):
打印(“M的秩为”)
印刷品(排名(M))
i2
如果我想使用Sage来确定向量
T
是否在某个矩阵的图像中,该矩阵是由另一个矩阵
M
的某些列的子集构成的
M1
,我会这样做:

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

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

我也很好奇秩包在Sage中是如何工作的。它给了我不同的答案(对于我来说,这是错误的),当我声明矩阵M超过实数时——也就是说,我使用MatrixSpace(RR,R,C)而不是MatrixSpace(QQ,R,C)——为什么会发生这种情况?出于我的目的,我需要矩阵的精确秩,而不是基于大于某个公差的奇异值数量的数值近似(我认为matlab就是这样做的,这导致我使用Sage)。我尝试使用符号秩——MatrixSpace(SR,R,C),但它使代码速度非常慢。那么围绕这些线的任何指针/提示呢?我不是数值分析师,但我相信矩阵的秩计算往往对矩阵项中的微小变化非常敏感,因此对不精确字段(如RR)的秩计算是可疑的。在像QQ这样精确(没有数字不确定性)的领域,rank工作得很好。