股票量化软件:赫兹量化中矩阵实用工具
从矩阵中删除多列
尝试删除单列时就是这种情况,但若有较大的矩阵包含大量我们想要一次性删除的列,为此,我们需要执行一些棘手的操作,避免误删所需的列,并避免尝试访问超界的数值, 基本上都是为了安全地删除列。
新矩阵的列数/大小要等于总列数减去我们要删除的列数,每列的行数保持不变(与旧矩阵相同)。
我们要做的第一件事是遍历我们要删除的所有选定列,以及旧矩阵中的所有可用列,如果要删除这些列,我们会将该列中的所有值设置为零。 这是一个明智的操作,可以最终得到一个干净的操作。
vector zeros(mat.Rows()); zeros.Fill(0); for(ulong i=0; i<size; i++) for(ulong j=0; j<mat.Cols(); j++) { if(cols[i] == j) mat.Col(zeros,j); }
我们要做的最后一件事是再次遍历矩阵两次,并检查所有填充零值的列,并将这些列逐个删除。
vector column_vector; for(ulong A=0; A<mat.Cols(); A++) for(ulong i=0; i<mat.Cols(); i++) { column_vector = mat.Col(i); if(column_vector.Sum()==0) MatrixRemoveCol(mat,i); }
注意到循环两次了吗? 它们非常重要,因为矩阵在删除每列后其大小都会调整,因此需再次循环,故再次返回检查我们是否跳过所需列非常必要。
下面是该函数的完整代码;
voidCMatrixutils::MatrixRemoveMultCols(matrix &mat,int &cols[]) { ulong size = (int)ArraySize(cols); if(size > mat.Cols()) { Print(__FUNCTION__," Columns to remove can't be more than the available columns"); return; } vector zeros(mat.Rows()); zeros.Fill(0); for(ulong i=0; i<size; i++) for(ulong j=0; j<mat.Cols(); j++) { if(cols[i] == j) mat.Col(zeros,j); } //--- vector column_vector; for(ulong A=0; A<mat.Cols(); A++) for(ulong i=0; i<mat.Cols(); i++) { column_vector = mat.Col(i); if(column_vector.Sum()==0) MatrixRemoveCol(mat,i); } }
我们看看这个函数的实际效果,我们尝试删除索引 0 和索引 2 处的列;Print("\nRemoving multiple columns"); int cols[2] = {0,2}; matrix_utils.MatrixRemoveMultCols(Matrix,cols); Print("Columns at 0,2 index removed New Matrix\n",Matrix);