Умножение матриц (дроби)

Привет, я сейчас создаю java-программу для умножения матриц на дроби, я уже создаю класс Fraction, код ниже.

public Fraccion (int n,int m){
    numerador = n;
    denominador = m;
}

который получает числитель и знаменатель, в моей основной функции я получаю размер матрицы, чтобы создать матрицу 2x2 3x3 и так далее... и в настоящее время я получаю ожидаемый результат. моя проблема заключается в умножении матрицы на саму себя (потому что это то, что я хочу)

так что это мой код для основного класса

private static void transicion()
{
    //size of matriz
    Fraccion[][] tmp = new Fraccion[cuantos][cuantos];
    //cloning the matrix to a temporal matrix
    tmp = matrix.clone();
    //set boundaries for matrix so dont go out of bounds
    int rowLimit = matrix.length;
    int colLimit = matrix[0].length;

    for (int i = 0; i < matrix.length; i++)
    {
        for (int j = 0; j < matrix[i].length; j++)
        {
            //method to multiply a fraction with another (producto_con)
            if ((j+1<colLimit) && (matrix[i][j] == matrix[i][j+1]))
                matrix[i][j].producto_con(tmp[i][j+1]);
            if ((i+1<rowLimit) && (matrix[i][j] == matrix[i+1][j]))
                matrix[i][j].producto_con(tmp[i][j+1]);
            System.out.println();
            matrix[i][j].imprimete();
        }
        System.out.println();
    }

}
//this is the method to multiply fractions on the fraction class
public Fraccion producto_con(Fraccion laOtra){
    int numTmp, denTmp;
    numTmp = numerator * laOtra.getnumerator();
    denTmp = denominator * laOtra.getdenominator();
    Fraccion laNueva = new Fraccion(numTmp,denTmp);
    return laNueva;
}

но когда я печатаю метод перехода, печатает ту же матрицу без изменений, пожалуйста, помогите или посоветуйте?


person Luis AC    schedule 21.10.2017    source источник
comment
но вы никогда не используете значение return laNueva;?   -  person Madhawa Priyashantha    schedule 21.10.2017


Ответы (1)


Вы создаете новые объекты Fraccion, но затем ничему их не присваиваете. Так что... конечно... ничего не меняется.

Более коварная проблема заключается в том, что ваши числитель и знаменатель хранятся как значения int, и вам нечего делать с возможностью того, что одно или другое может переполниться. Если это произойдет, вы получите мусорные значения.

Правильно работать со значениями знаменателя/числителя больше Integer.MAX_VALUE сложно.

  • Самый простой вариант - использовать представление, которое не будет переполняться (с вашим вариантом использования); например BigInteger но это тоже ограничено... размером вашей кучи.

  • Вы можете продвинуться дальше, если сможете найти и исключить общие множители в знаменателе и числителе, но разложение на множители дорого… и трудноразрешимо, если единственными множителями являются большие простые числа.)

person Stephen C    schedule 21.10.2017
comment
хорошо, теперь я создаю новую фракцию и присваиваю значение метода, затем создаю новую матрицу и ввожу это значение в матрицу - person Luis AC; 21.10.2017
comment
частный статический Fraccion nueva; Fraccion[][] nuev = new Fraccion[cuantos][cuantos]; nueva = matrix[i][j].producto_con(tmp[i][j+1]); nuev[i][j] = nueva; - person Luis AC; 21.10.2017
comment
Я создаю конструктор в своем классе дробей, который получает дробь и присваивает ее, я не знаю, правильно ли это. общественная дробь (доля дроби) { гидроразрыва = гидроразрыва; } но я печатаю 0/0 - person Luis AC; 21.10.2017
comment
Нет. Это неправильно. Он присваивает локальную переменную frac самой себе!! - person Stephen C; 21.10.2017
comment
Итак, что-то вроде этого? частная дробь; общественная дробь (доля дроби) { дробь = дробь; } - person Luis AC; 21.10.2017
comment
Неа. Вам нужно явно инициализировать поля Fraccion, которые вы создаете. Серьезно, я думаю, вам нужно прочитать учебник ... или ваш учебник. - person Stephen C; 21.10.2017