docs: public static DMatrixSparseCSC concatColumns(DMatrixSparseCSC left , DMatrixSparseCSC right ,
                                                   @Nullable DMatrixSparseCSC out )
      {
          if( left.numRows != right.numRows )
              throw new MatrixDimensionException("Number of rows must match. "+stringShapes(left,right));
          if( out == null )
              out = new DMatrixSparseCSC(0,0,0);
  
          out.reshape(left.numRows,left.numCols+right.numCols,left.nz_length+right.nz_length);
          out.nz_length = left.nz_length+right.nz_length;
  
          System.arraycopy(left.col_idx,0,out.col_idx,0,left.numCols+1);
          System.arraycopy(left.nz_rows,0,out.nz_rows,0,left.nz_length);
          System.arraycopy(left.nz_values,0,out.nz_values,0,left.nz_length);
  
          int index = left.nz_length;
          for (int i = 0; i < right.numCols; i++) {
              int r0 = right.col_idx[i];
              int r1 = right.col_idx[i+1];
  
              out.col_idx[left.numCols+i] = index;
              out.col_idx[left.numCols+i+1] = index + (r1 - r0);
  
              for (int j = r0; j < r1; j++, index++) {
                  out.nz_rows[index] = right.nz_rows[j];
                  out.nz_values[index] = right.nz_values[j];
              }
          }
          out.indicesSorted = left.indicesSorted && right.indicesSorted;
  
          return out;
      }