docs: @Override
  	protected void vertical( GrayF32 intensity ) {
  		float[] hXX = horizXX.data;
  		float[] hXY = horizXY.data;
  		float[] hYY = horizYY.data;
  		final float[] inten = intensity.data;
  
  		final int imgHeight = horizXX.getHeight();
  		final int imgWidth = horizXX.getWidth();
  
  		final int kernelWidth = radius * 2 + 1;
  
  		final int startX = radius;
  		final int endX = imgWidth - radius;
  
  		final int backStep = kernelWidth * imgWidth;
  
  		BoofConcurrency.loopBlocks(radius,imgHeight-radius,(y0,y1)->{
  		final float[] tempXX = work.pop();
  		final float[] tempXY = work.pop();
  		final float[] tempYY = work.pop();
  		for (int x = startX; x < endX; x++) {
  			// defines the A matrix, from which the eigenvalues are computed
  			int srcIndex = x + (y0-radius)*imgWidth;
  			int destIndex = imgWidth * y0 + x;
  			float totalXX = 0, totalXY = 0, totalYY = 0;
  
  			int indexEnd = srcIndex + imgWidth * kernelWidth;
  			for (; srcIndex < indexEnd; srcIndex += imgWidth) {
  				totalXX += hXX[srcIndex];
  				totalXY += hXY[srcIndex];
  				totalYY += hYY[srcIndex];
  			}
  
  			tempXX[x] = totalXX;
  			tempXY[x] = totalXY;
  			tempYY[x] = totalYY;
  
  			// compute the eigen values
  			inten[destIndex] = this.intensity.compute(totalXX,totalXY,totalYY);
  			destIndex += imgWidth;
  		}
  
  		// change the order it is processed in to reduce cache misses
  		for (int y = y0 + 1; y < y1; y++) {
  			int srcIndex = (y + radius) * imgWidth + startX;
  			int destIndex = y * imgWidth + startX;
  
  			for (int x = startX; x < endX; x++, srcIndex++, destIndex++) {
  				float totalXX = tempXX[x] - hXX[srcIndex - backStep];
  				tempXX[x] = totalXX += hXX[srcIndex];
  				float totalXY = tempXY[x] - hXY[srcIndex - backStep];
  				tempXY[x] = totalXY += hXY[srcIndex];
  				float totalYY = tempYY[x] - hYY[srcIndex - backStep];
  				tempYY[x] = totalYY += hYY[srcIndex];
  
  				inten[destIndex] = this.intensity.compute(totalXX,totalXY,totalYY);
  			}
  		}
  		work.recycle(tempXX);
  		work.recycle(tempXY);
  		work.recycle(tempYY);
  		});
  	}