docs: public static void rank1UpdateMultR(ZMatrixRMaj A,
                                          double u[], int offsetU,
                                          double gamma ,
                                          int colA0,
                                          int w0, int w1,
                                          double _temp[])
      {
  //        for( int i = colA0; i < A.numCols; i++ ) {
  //            double val = 0;
  //
  //            for( int k = w0; k < w1; k++ ) {
  //                val += u[k+offsetU]*A.data[k*A.numCols +i];
  //            }
  //            _temp[i] = gamma*val;
  //        }
  
          // reordered to reduce cpu cache issues
          int indexU = (w0+offsetU)*2;
          double realU = u[indexU];
          double imagU = -u[indexU+1];
  
          int indexA = (w0*A.numCols + colA0)*2;
          int indexTmp = colA0*2;
  
          for( int i = colA0; i < A.numCols; i++ ) {
              double realA = A.data[indexA++];
              double imagA = A.data[indexA++];
  
              _temp[indexTmp++] = realU*realA - imagU*imagA;
              _temp[indexTmp++] = realU*imagA + imagU*realA;
          }
  
          for( int k = w0+1; k < w1; k++ ) {
              indexA = (k*A.numCols + colA0)*2;
              indexU = (k+offsetU)*2;
              indexTmp = colA0*2;
  
              realU = u[indexU];
              imagU = -u[indexU+1];
  
              for( int i = colA0; i < A.numCols; i++ ) {
                  double realA = A.data[indexA++];
                  double imagA = A.data[indexA++];
  
                  _temp[indexTmp++] += realU*realA - imagU*imagA;
                  _temp[indexTmp++] += realU*imagA + imagU*realA;
              }
          }
  
          indexTmp = colA0*2;
          for( int i = colA0; i < A.numCols; i++ ) {
              _temp[indexTmp++] *= gamma;
              _temp[indexTmp++] *= gamma;
          }
  
          // end of reorder
  
          for( int i = w0; i < w1; i++ ) {
              indexA = (i*A.numCols + colA0)*2;
              indexU = (i+offsetU)*2;
              indexTmp = colA0*2;
  
              realU = u[indexU];
              imagU = u[indexU+1];
  
              for( int j = colA0; j < A.numCols; j++ ) {
                  double realTmp = _temp[indexTmp++];
                  double imagTmp = _temp[indexTmp++];
  
                  A.data[indexA++] -= realU*realTmp - imagU*imagTmp;
                  A.data[indexA++] -= realU*imagTmp + imagU*realTmp;
              }
          }
      }