Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > в результате 0...


Автор: Reptor 3.3.2008, 12:10
Есть у меня 2 матрицы которые я перемножая к примеру возьмём что они выглядят так

первая матрица:        вторая матрица  

2.34    4.56  1.03          0.003335   0.008556  0.0066342 
3.38    6.5    8.03    *    -0.083351   0.45895   0.1434534 
2.34    1.6    7.3            0.045555   0.044556  0.0467458 

ну суть второй матрицы что она имеет такие маленькие числа.


Вот так при их умножении в ручрую получаются числа но маленькие а при выводе результирующей матрицы там выходит

0.0   0.0    0.0
0.0   0.0    0.0
0.0   0.0    0.0

вот и дальше эта матрица участвует в операциях и всё 0. Использую тип 
Код

double


Вывод делаю просто 
Код

System.out.println(matrix[i][j])


почему такая большая погрешность. Может как то округлять результат? Что делать. Но 0 это совсем полный бред.  smile 



 





Автор: Kangaroo 3.3.2008, 12:16
Цитата(Reptor @  3.3.2008,  11:10 Найти цитируемый пост)
почему такая большая погрешность. Может как то округлять результат? Что делать. Но 0 это совсем полный бред.

Покажи как делаешь умножение, бага там спряталась.

Автор: Reptor 3.3.2008, 12:42
да нет вроде не должно. Я проверял много примеров на целых числах и всё ок было. 

Просто сейчас нет у меня этой функции что б выложить. Она на 2-ом компе.

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

Автор: LSD 3.3.2008, 13:40
Попробуй заменить double на BigDecimal с точностью вычислений 100.
Хотя тут по идее и точности double должно хватать.

Автор: Reptor 3.3.2008, 23:34
вот function которой я пользуюсь

Код

public static double[][] multiplicationMatrix(double[][] M1, double[][] M2){
        int rowsM1 = M1.length;
        int columnsM1 = M1[0].length;
        int rowsM2 = M2.length;
        int columnsM2 = M2[0].length;
        
        double[][] multiplication = new double[rowsM1][columnsM2];
        for(int i=0; i<rowsM1; i++){
            for(int j=0; j<columnsM2; j++){
                double [] ss = new double[columnsM1];
                for(int k=0; k<columnsM1; k++){
                    ss[k] = M2[k][j];
                }        
                multiplication[i][j] = getMultiplicationElement(M1[i], ss);
                //multiplication[i][j]=Math.round(multiplication[i][j]);
            }
        }    
        operationMatrix.printMatrix(multiplication);
        return multiplication;        
    }
    
    public static double getMultiplicationElement(double[] row, double[] column){
        int element = 0;
        
        for(int i=0; i<row.length; i++){
            element += row[i]*column[i];
        }        
        return element;
    }


а вот 2 матрицы

Matrix X
7.12    0.3        2.5  
4.01    31.34    11.45  
-1.23   -7.23   -5.33  
1.3        2.2      3.33  
-3.45    -2.2     -2.09  

matrixY

0.029004634440471744     0.00825091901179591     -0.03138605643665668  
0.008250919011795914     0.010562182383301711   -0.027503504621864853  
-0.03138605643665667     -0.02750350462186485      0.08151902688663817

Добавлено через 1 минуту
да и вот результат

0.0  0.0  0.0  
0.0  0.0  0.0  
0.0  0.0  0.0  
0.0  0.0  0.0  
0.0  0.0  0.0 

 smile 

Автор: Kangaroo 4.3.2008, 00:34
Reptor, 
поменяй вот так метод:
Код

 public static double getMultiplicationElement(double[] row, double[] column){
        double element = 0;
        
        for(int i=0; i<row.length; i++){
            element += row[i]*column[i];
        }        
        return element;
    }

Автор: niasilil 4.3.2008, 00:40
о, уже ответили smile
все равно, не зря же писал :

Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OperationMatrix {

    static double[][] m = { { 7.12, 0.3, 2.5 }, { 4.01, 31.34, 11.45 }, { -1.23, -7.23, -5.33 },
            { 1.3, 2.2, 3.33 }, { -3.45, -2.2, -2.09 } };
    static double[][] y = { { 0.029004634440471744, 0.00825091901179591, -0.03138605643665668 },
            { 0.008250919011795914, 0.010562182383301711, -0.027503504621864853 },
            { -0.03138605643665667, -0.02750350462186485, 0.08151902688663817 } };

    public static double[][] multiplicationMatrix(double[][] M1, double[][] M2) {
        int rowsM1 = M1.length;
        int columnsM1 = M1[0].length;
        int rowsM2 = M2.length;
        int columnsM2 = M2[0].length;

        double[][] multiplication = new double[rowsM1][columnsM2];
        for (int i = 0; i < rowsM1; i++) {
            for (int j = 0; j < columnsM2; j++) {
                double[] ss = new double[columnsM1];
                for (int k = 0; k < columnsM1; k++) {
                    ss[k] = M2[k][j];
                }
                multiplication[i][j] = getMultiplicationElement(M1[i], ss);
                // multiplication[i][j]=Math.round(multiplication[i][j]);
            }
        }
        OperationMatrix.printMatrix(multiplication);
        return multiplication;
    }

    static void printMatrix(double[][] m) {
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[0].length; j++) {
                System.out.print(m[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public static double getMultiplicationElement(double[] row, double[] column) {
        double element = 0;

        for (int i = 0; i < row.length; i++) {
            element += row[i] * column[i];
        }
        return element;
    }

    public static void main(String[] args) {
        OperationMatrix.printMatrix(m);
        System.out.println();
        OperationMatrix.printMatrix(y);
        System.out.println();
        OperationMatrix.printMatrix(multiplicationMatrix(m,y));
    }
}


7.12    0.3    2.5    
4.01    31.34    11.45    
-1.23    -7.23    -5.33    
1.3    2.2    3.33    
-3.45    -2.2    -2.09    

0.029004634440471744    0.00825091901179591    -0.03138605643665668    
0.008250919011795914    0.010562182383301711    -0.027503504621864853    
-0.03138605643665667    -0.02750350462186485    0.08151902688663817    

0.13052313182805592    -0.006843563475684732    -0.027922205998959587    
0.015522039736256765    0.04918985320962477    -0.054425063308230714    
0.07195783599031537    0.060080470618759305    -0.19704122547261085    
-0.048657521335502434    -0.057623674432211495    0.17014877599674877    
-0.052621152692966106    0.005779852825737869    -0.001585161318505529    
0.13052313182805592    -0.006843563475684732    -0.027922205998959587    
0.015522039736256765    0.04918985320962477    -0.054425063308230714    
0.07195783599031537    0.060080470618759305    -0.19704122547261085    
-0.048657521335502434    -0.057623674432211495    0.17014877599674877    
-0.052621152692966106    0.005779852825737869    -0.001585161318505529    

Автор: Reptor 4.3.2008, 01:10
аааа точнр огромное спасибо  smile  как это я проморгал 

Автор: LSD 4.3.2008, 14:01
Модератор: не забывай помечать вопрос как решенный!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)