// Evaluate result=leftFactor*left + productFactor*this^transpose*rightFactor protected override Vector <float> MultiplyAndAddAsLeftFactorCore( float leftFactor, Vector <float> left, float productFactor, TransposeOperation transpose, Vector <float> rightFactor, Vector <float> result) { // The matrix has 1+4*alpha on the main diagonal, // and -alpha on the 1st and nth sub and superdiagonal. // result may be null. Using MultiplyInto will create // a vector if necessary and will return it. result = Vector.MultiplyInto(leftFactor, left, result); // Diagonal result.AddScaledInPlace(1.0f + 4.0f * alpha, rightFactor); // Superdiagonal 1 result.GetSlice(0, N - 2, 1, Intent.WritableView) .AddScaledInPlace(-alpha, rightFactor.GetSlice(1, N - 1)); // Superdiagonal size result.GetSlice(0, N - n - 1, 1, Intent.WritableView) .AddScaledInPlace(-alpha, rightFactor.GetSlice(n, N - 1)); // Subdiagonal 1 result.GetSlice(1, N - 1, 1, Intent.WritableView) .AddScaledInPlace(-alpha, rightFactor.GetSlice(0, N - 2)); // Subdiagonal size result.GetSlice(n, N - 1, 1, Intent.WritableView) .AddScaledInPlace(-alpha, rightFactor.GetSlice(0, N - n - 1)); return(result); }