private void projectRow(BasicMatrix data, BasicMatrix ret, int row) {
        Vector r = data.get(row);
        synchronized (this) {
            r.map(new VectorMapper() {
                @Override
                public void map(int index, float value) {
                    if (!NumberUtils.isZero(value) && NumberUtils.isZero(RT.get(0, index))){
                        addRandomCol(RT, index);
                    }
                }
            });
        }
        for(int rtvi = 0; rtvi < RT.rows(); rtvi++) {
            final Vector rtv = RT.get(rtvi);
            final float[] holder = new float[1];

            r.intersect(rtv, new VectorVectorMapper() {
                @Override
                public boolean map(int index, float v1, float v2) {
                    holder[0] += v1 * v2;
                    return true;
                }
            });

            ret.set(row, rtvi, holder[0]);
        }
    }