Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69

Получить вектор (А-Е)*b, где Е – единичная матрица

29.07.2013, 21:34. Показов 5494. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый форумчане.
Собственно, без всяких лирических отступлений и прочего. При реализации задачи я столкнулся с некоторой загвосткой.
Собственно сама задача:
Даны квадратная матрица А порядка n и вектор b с n элементами. Получить вектор (А-Е)*b, где Е – единичная матрица. Определить функции формирования единичной матрицы и умножения квадратной матрицы на вектор.

Код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class MatrixMethod 
{
    private double[][] matrix;
    public MatrixMethod(double[][] matrix)
    {
        this.matrix = matrix;
    }
    private double[] vector;
    public MatrixMethod(double[] vector)
    {
        this.vector = vector;
    }
    public static double[][] createMatrix(int size) // получение еденичной матрицы
    {
        double[][] matrix = new double[size][size]; 
        int diagonal = size; 
        int value = 1;  
        for (int k = 0; k < diagonal; k++) 
        {
            matrix[k][k] = value; 
        }
        return matrix;
    }
    
    public MatrixMethod sub(MatrixMethod matrix) // (А-Е)
    {
        final int size = matrix.matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                    result[i][j] = this.matrix[i][j] - createMatrix(4)[i][j];
            }
        }
        return new MatrixMethod(result);
        
    }
    public MatrixMethod multuply(MatrixMethod vector) // (А-Е)*b
    {
        final int size = matrix.length = vector.vector.length;
        double[][] result = new double[size][size];
        for(int i=0; i<size; i++)
        {
            for(int j=0; j<size; j++)
            {
                result[i][j] = 0;
                for (int s=0; s<size; s++)
                {
                    result[i][j] += sub.matrix[i][s] * this.vector[s]; 
                }
            }
        }
        return new MatrixMethod(result);
        
    }
    
    public static void printMatrix(double[][] matrix) 
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + "\t");
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        //System.out.println(sub(a));
        //double[][] matrix = createMatrix(4);
        //printMatrix(matrix);
    }
 
}
Собственно, комментарии описывают методы.
Казалось бы, простая задача. Ан нет и тут я "спотыкнулся" на ровном месте, а вот "встать" чего-то не могу. Вот в чем моя, так сказать, проблема:
В методе multuply компилятор ругается на следующую строчку:
Java
1
result[i][j] += sub.matrix[i][s] * this.vector[s];
а именно на sub. Из-за чего ругается - понять не могу. Вот, собственно, с таким вопросом я сюда обращаюсь - из-за чего ругается и как устранить?

Добавлено через 2 часа 9 минут
Вот, немного привел в потребный вид. (Проблема по прежнему осталась)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
public class MatrixMethod 
{
    private double[][] matrix;
    public MatrixMethod(double[][] matrix)
    {
        this.matrix = matrix;
    }
    private double[] vector;
    public MatrixMethod(double[] vector)
    {
        this.vector = vector;
    }
    public static double[][] createMatrix(int size) // получение еденичной матрицы
    {
        double[][] matrix = new double[size][size]; 
        int diagonal = size; 
        int value = 1;  
        for (int k = 0; k < diagonal; k++) 
        {
            matrix[k][k] = value; 
        }
        return matrix;
    }
    
    public MatrixMethod sub(MatrixMethod matrix) // ()
    {
        final int size = matrix.matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                    result[i][j] = this.matrix[i][j] - createMatrix(4)[i][j];
            }
        }
        return new MatrixMethod(result);
        
    }
    public MatrixMethod multuply(MatrixMethod vector)
    {
        final int size = matrix.length = vector.vector.length;
        double[][] result = new double[size][size];
        for(int i=0; i<size; i++)
        {
            for(int j=0; j<size; j++)
            {
                result[i][j] = 0;
                for (int s=0; s<size; s++)
                {
                    result[i][j] += sub.matrix[i][s] * this.vector[s]; 
                }
            }
        }
        return new MatrixMethod(result);
        
    }
    
    public void print()
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + ", ");
            }
            System.out.println();
        }
 
    }
    
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        double[] b = {2, 2, 3, 4};
        MatrixMethod c = new MatrixMethod(a);
        MatrixMethod d = new MatrixMethod(b);
        MatrixMethod e = c.multuply(d);
        e.print();
        //System.out.println(sub(a));
        //double[][] matrix = createMatrix(4);
        //printMatrix(matrix);
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.07.2013, 21:34
Ответы с готовыми решениями:

Получить вектор (А-Е)b, где Е -единичная матрица порядка n.
Дана квадратная матрица А порядка n и вектор с n элементами. Получить вектор (А-Е)b, где Е -единичная матрица порядка n. Программу...

Получить вектор (А * Е) b, где Е-единичная матрица порядка n
Есть квадратная матрица A порядка n и вектор b с n элементами. Получить вектор (А * Е) b, где Е-единичная матрица порядка n

Даны квадратная матрица A порядка n и вектор с n элементами. Получить вектор: (A=E)b, где E единичная матрица порядка n
Даны квадратная матрица A порядка n и вектор с n элементами. Получить вектор: (A=E)b, где E-единичная матрица порядка n. Помогите...

27
352 / 162 / 20
Регистрация: 22.12.2011
Сообщений: 352
30.07.2013, 11:24
iiyuijkhgfjf, что такое sub у вас в коде? Правильно, метод. Как вы используете sub в коде? Правильно, как объект. А методы они такие, их вызывать нужно сначала. С параметрами даже!
1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
30.07.2013, 13:34  [ТС]
Здравствуйте.
Sakralbar, можете, пожалуйста, привести пример. Т.к. пробовал, но все равно ругается на sub. Возможно, я чего-то не то делаю. Но пример был бы мне рчень полезен. (Т.к. именно с правильным вызовом методов я испытываю некоторые проблемы).
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
30.07.2013, 14:40
Выражение
Java
1
sub.matrix[i][s]
Означает следующее "Взять объект sub. У этого объекта взять значение поля matrix, которое является двумерным массивом. В этом массиве взять элемент в i-й строке s-го столбца".

У вас есть объект sub? Нет. Тем более нет никакого поля matrix и никаких строк и столбцов.

Поэтому это выражение в рамках приведенного кода лишено смысла.

Вам нужно написать выражение вида <Объект класса MatrixMethod>.sub(<Объект класса MatrixMethod>)

Должен заметить, что само название класса "MatrixMethod" представляется мне довольно неудачным. Чем вас не устроило просто "Matrix"?
1
352 / 162 / 20
Регистрация: 22.12.2011
Сообщений: 352
30.07.2013, 14:52
iiyuijkhgfjf, метод
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
public MatrixMethod sub(MatrixMethod matrix)
принимает в качестве аргумента MatrixMethod matrix и вычитает из данной матрицы единичную. Соответственно вызов должен быть что-то вроде
Java
1
2
MatrixMethod matrix =  new MatrixMethod(new double[n][n]);
sub(matrix);

Не по теме:

Сугубо моё мнение: вообще советую вам переписать свой код.
1: Два конструктора, определяющие по одному полю, как по мне - не особо хорошо
2: Подумайте, какие методы у вас должны быть статические.
3: Подумайте, как лучше назвать ваши методы (это ОЧЕНЬ важно!)
Такое объявление

Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
public static double[][] createMatrix(int size)
совершенно не говорит мне, что тут создается именно единичная матрица
4: "Функция должна делать только одну операцию, она должна делать ее очень хорошо, и большо она ничего делать не должна". Если у вас есть функция sub, то она должна вычитать из матрицы матрицу, а не просто единичную. Есть Функция multuply - должна перемножать матрицы, а не сначала вычитать единичную и потом умножать на вектор.
(если что, то вектор - матрица размера 1 x N)
----------------
Старайтесь сразу писать хорошо и правильно, иначе вы сначала себе будете вредить, а потом (если устроитесь программистом) - другим. Считайте, что это - некоторый этикет.
----------------
Вообще идеально было бы сначала написать класс Matrix и реализовать в нем методы вычитания, сложения и умножения матриц. И вообще привыкайте разбивать задачи на подзадачи, легче вам же будет.
----------------
Критика, коллеги? =)

1
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
30.07.2013, 15:09
Кроме того, мне представляется неудачным решение создать метод print() внутри класса MatrixMethod. Это не задача матрицы - печататься в консоль. Задача матрицы - по требованию преобразоваться в текстовый вид. Класс не должен брать на себя не свойственных ему функций, так как это делает код запутанным и нелогичным. Общепринятым решением является переопределить метод toString() родительского класса Object. У любого класса должен быть переопределен метод toString(), потому что его реализация в классе Object неинформативна в 99% случаев. Когда другой программист захочет напечатать матрицу, он сделает так:
Java
1
2
3
4
Matrix myMatrix;
//Initialize matrix
//...
System.out.print(myMatrix);
Примерно также он поступит, если ему захочется поместить матрицу в текстовый файл.
Понятно, что пока вы учитесь вам все легко и понятно. Но если вы будете работать - вам придется думать не только о своем удобстве но и об удобстве других людей.

Не рекомендуется смешивать поля и методы внутри класса. Поля желательно выделить отдельно в начале класса. Совсем здорово будет разделить public/private, выделить отдельно static и final поля.

Про единичную матрицу уже сказали - это абсолютно неочевидное поведение. Логичнее создать нулевую матрицу, но никак не единичную.
2
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
31.07.2013, 01:52  [ТС]
Sakralbar, Gibby, спасибо ОГРОМНОЕ за критику и дельные советы.

Добавлено через 3 часа 1 минуту
Нет, или я дурак, или я что-то не так делаю.
Вот код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class Matrix 
{
    private double[][] matrix;
    public Matrix(double[][] matrix)
    {
        this.matrix = matrix;
    }
    private double[] vector;
    public Matrix(double[] vector)
    {
        this.vector = vector;
    }
    public static double[][] singleMatrix(int size) // получение еденичной матрицы
    {
        double[][] matrix = new double[size][size]; 
        int diagonal = size; 
        int value = 1;  
        for (int k = 0; k < diagonal; k++) 
        {
            matrix[k][k] = value; 
        }
        return matrix;
    }
    
    public Matrix sub(Matrix matrix) 
    {
        final int size = matrix.matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                    result[i][j] = this.matrix[i][j] - singleMatrix(4)[i][j];
            }
        }
        return new Matrix(result);  
    }
    
    public Matrix multiply(Matrix vector)
    {
        final int size = matrix.length = vector.vector.length;
        double[][] result = new double[size][size];
        Matrix sub = new Matrix(matrix);
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                result[i][j] = 0;
                for (int s=0; s<size; s++)
                {
                    result[i][j] = Matrix.sub(matrix)[i][s] * this.vector[s];
                }
            }
        }
        return new Matrix(result);
    }
    public void print()
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + ", ");
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        double[] b = {2, 2, 3, 4};
        Matrix c = new Matrix(a);
        Matrix d = new Matrix(b);
        Matrix e = c.multiply(d);
        e.print();
        //System.out.println(sub(a));
        //double[][] matrix = createMatrix(4);
        //printMatrix(matrix);
    }
 
}
Все то же самое.

P.S. честно, я не знаю из-за чего но у меня не получается вызвать этот метод.
Проверял 2 предыдущих метода - работают нормально, метод multiply - вот в нем что-то не так.

Добавлено через 4 часа 34 минуты
Дело вот в чем: примерное представление о том, как надо вызывать метод имею. НО в контексте этой задачи я из-за чего-то теряю возможность реализации поставленной цели.
Начнем, пожалуй с первого.
У меня есть объект sub? Да, вот я его указываю в методе multiply
Java
1
Matrix sub = new Matrix(matrix);
Вот, думаю, что вся загвостка именно в этом - я прошу вызвать то, чего по сути компьютер не видит (тот самый необходимый метод sub, простите, если не так высказываюсь или пишу откровенную чушь - просто я очень хочу разобраться с этой задачей и в данном случае - с этой проблемой, т.к. именно таким образом я смогу получить новый для себя опыт).
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
31.07.2013, 09:32
Java
1
final int size = matrix.length = vector.vector.length;
Так писать нельзя. JAVA такого не понимает.

Java
1
Matrix.sub(matrix)
Посмотрите на описание метода sub:

Java
1
public Matrix sub(Matrix matrix)
А теперь посмотрите на описание поля matrix:

Java
1
private double[][] matrix;
И поймите что не так.

У вас вообще слишком много всяких matrix. Это путает.

Кстати, в какой IDE вы работаете? Мои NetBeans выдают достаточно внятные подсказки об ошибках.
0
352 / 162 / 20
Регистрация: 22.12.2011
Сообщений: 352
31.07.2013, 09:38
iiyuijkhgfjf,
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
Matrix.sub(matrix)[i][s]
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
Matrix sub = new Matrix(matrix);
Придется переименовать метод или переменную.
Так же
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
Matrix.sub(matrix)[i][s]
для такого вызова нужно, чтобы метод sub был статическии.
Еще,
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
result[i][j] = this.matrix[i][j] - singleMatrix(4)[i][j];
Почему метод singleMatrix вызывается именно с аргументом 4? В любом случает создается матрица размером 4 х 4? И кстати лучше вынести результат этого вызова в отдельную переменную, ибо вы при каждой итерации цикла вызываете этот метод.
------------------
И да, мы уже вам советовали - разберитесь в своей IDE, они обычно помогают самому выявить ошибки.
0
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
31.07.2013, 22:20  [ТС]
Здравствуйте.
Gibby,
Цитата Сообщение от Gibby Посмотреть сообщение
Посмотрите на описание метода sub:

public Matrix sub(Matrix matrix)

А теперь посмотрите на описание поля matrix:

private double[][] matrix;

И поймите что не так.
Они отличаются доступом (public и private), также отличаются типом (Matrix и double).

Sakralbar,
Цитата Сообщение от Sakralbar Посмотреть сообщение
Придется переименовать метод или переменную.
Пробовал, проблема сохранилась (еще раз попробую).
Цитата Сообщение от Sakralbar Посмотреть сообщение
Почему метод singleMatrix вызывается именно с аргументом 4? В любом случает создается матрица размером 4 х 4?
Выбор размера матрицы может быть любой, но я остановился именно на этом, т.к. с такой матрицей мне нагляднее работать.

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

Добавлено через 1 час 13 минут
Немного отредактировал код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public class Matrix 
{
    private double[][] matrix;
    public Matrix(double[][] matrix)
    {
        this.matrix = matrix;
    }
    private double[] vector;
    public Matrix(double[] vector)
    {
        this.vector = vector;
    }
    public static double[][] singleMatrix(int size) // получение еденичной матрицы
    {
        double[][] matrix = new double[size][size]; 
        int diagonal = size; 
        int value = 1;  
        for (int k = 0; k < diagonal; k++) 
        {
            matrix[k][k] = value; 
        }
        return matrix;
    }
    
    public Matrix sub(double[][] matrix) 
    {
        final int size = matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                    result[i][j] = this.matrix[i][j] - singleMatrix(4)[i][j];
            }
        }
        return new Matrix(result);  
    }
    
    public Matrix multiply(Matrix vector)
    {
        final int size = matrix.length;
        matrix.length = vector.vector.length;
        double[][] result = new double[size][size];
        Matrix sub = new Matrix(matrix);
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                result[i][j] = 0;
                for (int s=0; s<size; s++)
                {
                    result[i][j] = Matrix.sub(matrix)[i][s] * this.vector[s];
                }
            }
        }
        return new Matrix(result);
    }
    public void print()
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + ", ");
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        double[] b = {2, 2, 3, 4};
        Matrix c = new Matrix(a);
        Matrix d = new Matrix(b);
        Matrix e = c.multiply(d);
        e.print();
        //System.out.println(sub(a));
        //double[][] matrix = createMatrix(4);
        //printMatrix(matrix);
    }
 
}
Что изменил.
Строка объявления метода sub
Java
1
public Matrix sub(double[][] matrix)
До этого было:
Java
1
public Matrix sub(Matrix matrix)
Добавлено через 4 минуты
Пока компилятор все равно ругается, думаю, что из-за того, что я не присваиваю модификатор static вот в этом месте:
Java
1
public Matrix sub(double[][] matrix)
Добавлено через 51 минуту
При подстановке static все равно сохраняется проблема.
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
01.08.2013, 09:56
Основная проблема, что вы не задумываясь над архитектурой программы начали писать код. Когда код не захотел работать вы начали вносить в него какие-то случайные изменения, делая код все менее и менее понятным.

Я вам опишу то, как я вижу вашу программу с точки зрения архитектуры:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Matrix {
    private double[][] aMatrix;
    
    public static Matrix add(Matrix m1, Matrix m2) {
    }
    
    public static Matrix substitute(Matrix m1, Matrix m2) {
    }
    
    public static Matrix multiply(Matrix m1, Matrix m2) {
    }
    
    public Matrix(int rows, int columns) {
    }
    
    public void toIdentity() {
        
    }
    
    public void setElement(int row, int column, double value) {
    }
    
    public double getElement(int row, int column) {
    }
    
    @Override
    public String toString() {
    }
}
2
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
01.08.2013, 17:05  [ТС]
Здравствуйте.
Основная идея была такая:
1. Сделать метод, создающий еденичную матрицу.
2. Метод, вычитающий обычную квадратную матрицу из единичной.
3. Метод, умножающий результат 2-го пункта на вектор.
4. Вывести полученный результат на экран.

Первые 2 пункта и пункт 4 получились и работают. 3-тий отказывается работать.

Добавлено через 10 минут
Вот что на данный момент имею:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public class Matrix 
{
    private double[][] matrix;
    public Matrix(double[][] matrix)
    {
        this.matrix = matrix;
    }
    private double[] vector;
    public Matrix(double[] vector)
    {
        this.vector = vector;
    }
    public static double[][] singleMatrix(int size) // получение еденичной матрицы
    {
        double[][] matrix = new double[size][size]; 
        int diagonal = size; 
        int value = 1;  
        for (int k = 0; k < diagonal; k++) 
        {
            matrix[k][k] = value; 
        }
        return matrix;
    }
    
    public static Matrix sub(double[][] matrix) 
    {
        final int size = matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                    result[i][j] = matrix[i][j] - singleMatrix(4)[i][j];
            }
        }
        return new Matrix(result);  
    }
    
    public Matrix multiply(Matrix vector)
    {
        final int size = matrix.length;
        matrix.length = vector.vector.length;
        double[][] result = new double[size][size];
        Matrix sub = new Matrix(matrix);
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                result[i][j] = 0;
                for (int s=0; s<size; s++)
                {
                    result[i][j] = Matrix.sub(matrix)[i][s] * this.vector[s]; // тут из-за чего-то происходит ошибка
                }
            }
        }
        return new Matrix(result);
    }
    public void print()
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + ", ");
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        double[] b = {2, 2, 3, 4};
        Matrix c = new Matrix(a);
        Matrix d = new Matrix(b);
        Matrix e = c.multiply(d);
        e.print();
        //System.out.println(sub(a));
        //double[][] matrix = createMatrix(4);
        //printMatrix(matrix);
    }
 
}
Добавлено через 1 минуту
Цитата Сообщение от Gibby Посмотреть сообщение
Я вам опишу то, как я вижу вашу программу с точки зрения архитектуры:
Gibby, я понял вашу идею. Но, т.к. я только начинающий и учусь я хотел максимально упростить задачу вот до этих 4-ех пунктов (еще раз повторюсь):
1. Сделать метод, создающий еденичную матрицу.
2. Метод, вычитающий обычную квадратную матрицу из единичной.
3. Метод, умножающий результат 2-го пункта на вектор.
4. Вывести полученный результат на экран.
0
352 / 162 / 20
Регистрация: 22.12.2011
Сообщений: 352
01.08.2013, 17:14
iiyuijkhgfjf, вам нужно переименовать метод sub либо переменную sub. Уже говорили об этом.
Советую вам так-же читать и кидать сюда коды ошибок, а так же таки научиться пользоваться IDE. Первоочередной навык же при работе в среде разработки.
1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
01.08.2013, 22:01  [ТС]
Sakralbar, На данный момент мне высвечивается вот такое сообщение об ошибке:
The type of the expression must be an array type but it resolved to Matrix

Цитата Сообщение от Sakralbar Посмотреть сообщение
вам нужно переименовать метод sub либо переменную sub
переменную - имеется в виду переменную метода sub?

Добавлено через 4 часа 40 минут
Вобщем, дело обстоит в следующем.
Я не знаю как реализовать задачу, которая на листке бумаги вычисляется меньше минуты.
Возможно, я так и не понял что делать. Писал программу с чистого листа и по новой - ничего не получается.
Вобщем, если кому не сложно - помогите разобраться вот с этим методом:
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
multiply
Честно, я уже не понимаю каким образом написать: "Умножь мне вектор на разность двух матриц". Перепробовал все возможные (для меня) варианты - толку нуль.
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
01.08.2013, 23:58
1. Создаете метод, который вернет квадратную матрицу
2. Создаете метод, который заполнит матрицу элементами
3. Создаете метод, который вернет единичную матрицу
4. Создаете метод, который вычтет из одной матрицы другую и вернет вам матрицу-результат
5. Создаете метод, который вернет вам вектор
6. Используете метод из п.2 чтобы заполнить вектор элементами
7. Создаете метод, который умножит матрицу-результат из п.4 на вектор из п.6
1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
02.08.2013, 20:37  [ТС]
Здравствуйте.
Пробую реализовать свой вариант решения (см. ниже). Также, параллельно, занимаюсь вариантом, предложенным Gibby.
На данный момент времени выкладываю свой вариант (компилятор указывает на ошибки - см. комментарии в коде)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class Matrix 
{
 
    private double[][] matrix;
    public Matrix(double[][] matrix)
    {
        this.matrix = matrix;
    }
    //private double[] vector;
    //public Matrix(double[] vector)
    //{
        //this.vector = vector;
    //}
    public Matrix singleMatrix(int size) // получение еденичной матрицы
    {
        //int size = matrix.matrix.length;
        double[][] result = new double[size][size]; 
        int value = 1;
        for (int i=0; i<size; i++) 
        {
            result[i][i] = value;             
        }
        return new Matrix(result);
    }
    public Matrix sub(Matrix matrix)
    {
        int size = matrix.matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                result[i][j] = this.matrix[i][j] - singleMatrix(size)[i][j]; // тут ошибка (компилятор указывает на следующее: The type of the expression must be an array type but it resolved to Matrix)
            }
        }
        return new Matrix(result);
    }
    public Matrix multiply(Matrix matrix)
    {
        int size = matrix.matrix.length;
        double[][] result = new double[size][size];
        for (int i=0; i<size; i++)
        {
            for (int j=0; j<size; j++)
            {
                result[i][j] = 0;
                for (int s=0; s<size; s++)
                {
                    result[i][j] += sub(matrix.matrix)[i][s] * this.matrix[s][j]; // тут ошибка (компилятор указывает на следующее: The method sub(Matrix) in the type Matrix is not applicable for the arguments (double[][]))
                }
            }
        }
        return new Matrix(result);
    }
    public void print()
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + ", ");
            }
            System.out.println();
        }
 
    }
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        double[][] b = {{2}, 
                        {2},
                        {3},
                        {4}};
    }  
}
Еще раз повторю свою идею:
Есть 3 метода (создание ед. матрицы, вычитание и умножение)
Я в методе main создаю матрицу, из которой будет вычитаться ед. матрица.
Далее создаю матрицу-вектор. и умножаю ее на полученный результат вычитания.
Как это по идее должно быть приведу в примере вычитания матриц.
Вот сам метод:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public MatrixMethod sub(MatrixMethod matrix)
    {
        final int n = matrix.matrix.length;
        double[][] result = new double[n][n];
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<n; j++)
            {
                    result[i][j] = this.matrix[i][j] - matrix.matrix[i][j];
            }
        }
        return new MatrixMethod(result); 
    }
В примере ниже я начинаю работать с этим методом след. образом:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SubTest 
{
    public static void main(String[] args) 
    {
        double[][] a = {{2, 2, 3, 4},
                        {2, 3, 1, 3},
                        {3, 4, 6, 6},
                        {7, 4, 5, 7},};
        
        double[][] b = {{1, 2, 3, 4},
                        {2, 2, 1, 3},
                        {3, 4, 5, 6},
                        {7, 4, 5, 6},};
        MatrixMethod c = new MatrixMethod(a); 
        MatrixMethod d = new MatrixMethod(b);
        MatrixMethod e = c.sub(d);
        e.print();
    }
}
Метод, осуществляющий печать матрицы:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public void print()
    {
        for (double[] row : matrix) 
        {
            for (double value : row) 
            {
                System.out.print(value + ", ");
            }
            System.out.println();
        }
 
    }
Итоговый результат - верный.

Вот примерно так я хочу реализовать и вот эту задачу, но сталкиваюсь с проблемами (см. комментарии).
0
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
07.08.2013, 11:55  [ТС]
Здравствуйте.
Проблема все так же осталась. Честно говоря, уже не знаю, что именно я не так делаю. И обратится, по сути, не к кому за помощью...
Честно, укажите что именно я не так делаю.
Еще, как назло, при переустановке системы забыл скопировать то что сделал...
Вобщем, прошу помощи, SOS.
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
07.08.2013, 14:18
App.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class App {
    public static void main(String args[]) {
        final int MATRIX_SIZE = 6;
        final int MAX_VALUE = 10;
        
        Matrix a = Matrix.square(MATRIX_SIZE);
        a.fillRandom(MAX_VALUE);
        System.out.println("Matrix A(" + 
                MATRIX_SIZE + "x" + MATRIX_SIZE + "):\n" + a);
        
        Matrix e = Matrix.identity(MATRIX_SIZE);
        
        Matrix v = Matrix.vectorColumn(MATRIX_SIZE);
        v.fillRandom(MAX_VALUE);
        System.out.println("Vector V(" + MATRIX_SIZE + "x1):\n" + v);
        
        Matrix b = Matrix.multiply(Matrix.subtract(a, e), v);
        System.out.println("(A - E) x V =\n" + b);
    }
}
Matrix.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
import java.util.Random;
 
public class Matrix {
    private static Random randomEngine  = new Random();
    
    private int[][] matrix;
    private int rows;
    private int columns;
    
        
 
    /**
     * Public constructor
     * @param rows
     * @param columns 
     */
    public Matrix(int rows, int columns) {
        matrix = new int[rows][columns];
        this.rows = rows;
        this.columns = columns;
    }
    
    //######################################################################
    //Static factories
    //######################################################################
    
    /**
     * Creates matrix of the standard form. Equivalent of public constructor
     * @param rows
     * @param columns
     * @return 
     */
    public static Matrix standard(int rows, int columns) {
        Matrix instance = new Matrix(rows, columns);
        return instance;
    }
    
    /**
     * Creates a vector-row
     * @param size
     * @return 
     */    
    public static Matrix vectorRow(int size) {
        Matrix instance = new Matrix(1, size);
        return instance;
    }
    
    /**
     * Creates a vector-column
     * @param size
     * @return 
     */
    public static Matrix vectorColumn(int size) {
        Matrix instance = new Matrix(size, 1);
        return instance;
    }
    
    /**
     * Creates a square matrix
     * @param size
     * @return 
     */
    public static Matrix square(int size) {
        Matrix instance = new Matrix(size, size);
        return instance;
    }
    
    /**
     * Creates an identity matrix
     * @param size
     * @return 
     */
    public static Matrix identity(int size) {
        Matrix instance = new Matrix(size, size);
        
        for (int i = 1; i <= size; i++)
            instance.setValue(i, i, 1);
        return instance;
    }
    
    //######################################################################
    //Getters&setters
    //######################################################################
    
    /**
     * 
     * @return number of rows
     */
    public int getRows() {
        return this.rows;
    }
    
    /**
     * 
     * @return number of columns
     */
    public int getColumns() {
        return this.columns;
    }
    
    /**
     * Set into certain cell certain value
     * @param row cell row
     * @param column cell column
     * @param value input value
     * @throws IllegalArgumentException if row or column is out of range
     */    
    public void setValue(int row, int column, int value) 
            throws IllegalArgumentException {
        if (this.rows < row - 1 || row <= 0) 
            throw new IllegalArgumentException("Illegal row");
        if (this.columns < column - 1 || column <= 0) 
            throw new IllegalArgumentException("Illegal column");
        
        matrix[row - 1][column - 1] = value;
    }
    
    public int getValue(int row, int column) 
            throws IllegalArgumentException {
        if (this.rows < row - 1 || row <= 0) 
            throw new IllegalArgumentException("Illegal row");
        if (this.columns < column - 1 || column <= 0) 
            throw new IllegalArgumentException("Illegal column");
        
        return matrix[row - 1][column - 1];
    }
    
    //######################################################################
    //Operations with matrixes
    //######################################################################
    
    /**
     * 
     * @param m1
     * @param m2
     * @return new matrix, representing sum of two matrixes
     * @throws IllegalArgumentException if matrixes have different size
     */
    public Matrix add(Matrix m1, Matrix m2)
            throws IllegalArgumentException {
        if(m1.getRows() != m2.getRows() || 
                m1.getColumns() != m2.getColumns()) {
            throw new IllegalArgumentException(
                    "Matrixes should have same size");
        }
        
        Matrix instance = new Matrix (m1.getRows(), m1.getColumns());
        for (int i = 1; i <= m1.getRows(); i++) {
            for (int j = 1; j <= m1.getColumns(); j++) {
                instance.setValue(i, j, 
                        m1.getValue(i, j) + m2.getValue(i, j));
            }            
        }
        return instance;
    }    
    
    /**
     * 
     * @param m1
     * @param m2
     * @return new matrix representing result of subtraction m2 from m1
     * @throws IllegalArgumentException  if matrixes have different size
     */
    public static Matrix subtract(Matrix m1, Matrix m2)
            throws IllegalArgumentException {
        if(m1.getRows() != m2.getRows() || 
                m1.getColumns() != m2.getColumns()) {
            throw new IllegalArgumentException(
                    "Matrixes should have same size");
        }
        
        Matrix instance = new Matrix (m1.getRows(), m1.getColumns());
        for (int i = 1; i <= m1.getRows(); i++) {
            for (int j = 1; j <= m1.getColumns(); j++) {
                instance.setValue(i, j, 
                        m1.getValue(i, j) - m2.getValue(i, j));
            }            
        }
        return instance;
    }
    
    /**
     * 
     * @param m1
     * @param m2
     * @return representing result of multiplication of m1 on m2
     * @throws IllegalArgumentException if m1.column != m2.row
     */
    public static Matrix multiply(Matrix m1, Matrix m2) 
            throws IllegalArgumentException {
        if(m1.getColumns() != m2.getRows()) {
            throw new IllegalArgumentException(
                    "Number of columns in first matrix should equal "
                    + "number of rows in second matrix");
        }
        
        Matrix instance = new Matrix(m1.getRows(), m2.getColumns());
        for (int row1 = 1; row1 <= m1.getRows(); row1++) {
            for (int column2 = 1; column2 <= m2.getColumns(); column2++) {
                int sum = 0;
                for (int i = 1; i <= m1.getColumns(); i++) {
                    sum += m1.getValue(row1, i) * 
                            m2.getValue(i, column2);
                }
                instance.setValue(row1, column2, sum);
            }
        }
        return instance;
    }
    
    //######################################################################
    //Other methods
    //######################################################################
    
    /**
     * fills matrix with random values up to certain maximum value
     * @param maxValue 
     */
    public void fillRandom(int maxValue) {
        for (int i = 0; i < this.rows; i++) {
            for (int j = 0; j < this.columns; j++) {
                matrix[i][j] = randomEngine.nextInt(maxValue);
            }
        }
    }
    
    @Override
    public String toString() {
        String str = "";
        for (int i = 0; i < this.rows; i++) {
            for (int j = 0; j < this.columns; j++) {
                str += this.matrix[i][j] + 
                        ((j == this.columns - 1) ?  "" : " "); 
            }
            str += (i == this.rows - 1) ?  "" : "\n";
        }
        return str;
    }
}
1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
07.08.2013, 15:11  [ТС]
Здравствуйте.
Gibby, спасибо, за помощь. Но можете, пожалуйста объяснить почему мой вариант не работает?
Пробовал по отдельности каждый метод (в моем варианте) - все работает. Компаную вместе - не работает. Что именно я не так делаю?
И еще вопрос: как правильно вызывать методы?

Добавлено через 2 минуты
И еще вопрос:
Разъясните вот данную часть:
Цитата Сообщение от Gibby Посмотреть сообщение
App.java:
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
07.08.2013, 15:29
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
Разъясните вот данную часть:
Названия файлов-модулей. Можете не обращать внимания.


Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
Но можете, пожалуйста объяснить почему мой вариант не работает?
Конкретно по ошибкам:

Java
1
result[i][j] = this.matrix[i][j] - singleMatrix(size)[i][j]; // тут ошибка (компилятор указывает на следующее: The type of the expression must be an array type but it resolved to Matrix)
Посмотрите как объявлен ваш метод singleMatrix (правильный перевод, кстати, identity matrix):
Java
1
public Matrix singleMatrix(int size) // получение еденичной матрицы
А теперь посмотрите, как вы пытаетесь его использовать:

Java
1
singleMatrix(size)[i][j]
Операторы [] - это собственность объектов типа Array. А ваш объект имеет тип Matrix и ничего общего с Array. Поэтому компилятор в недоумении - что ему делать в объекте Matrix с оператором []? Может быть, вы хотите сделать

Java
1
(singleMatrix(size)).matrix[i][j]
, т.е. снала получить единичную матрицу, а потом обратиться к ее полю? Но это тоже вызовет законное возмущение компилятора - ведь в классе объявлено
Java
1
private double[][] matrix;
т.е. поле имеет область видимости private и делиться его содержанием ни с кем нельзя. А вы берете и пытаетесь нагло к нему обратиться извне.

Возможно, вам стоило реализовать метод

Java
1
public double getValue(int row, int column) { }
, который бы возвращал вам значение соответствующего поля матрицы. Тогда вы могли бы вызвать
Java
1
singleMatrix(size).getValue(i, j)
Это бы наверняка заработало.

Аналогично вторая ошибка, где вы тем же варварским способом пытаетесь работать с методом sub:
Java
1
sub(matrix.matrix)[i][s]
Добавлено через 4 минуты
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
И еще вопрос: как правильно вызывать методы?
Не понял вопроса. Вообще или в том, что я написал? Так у меня есть примеры вызовов
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.08.2013, 15:29
Помогаю со студенческими работами здесь

Для матриц I=2P-E, где Е-единичная матрица,а Р=Р(n,n), проверить св-во I^2=Е.При помощи метода Гаусса решить СЛАУ Ix=y, где вектор состоит из единиц.
Добрый день!Помогите пожалуйста с решением данной задачи: Задание: Необходимо написать и отладить программу в среде Borland C++ 3.1 по...

Проверить для матрицы H=E-vvT/|v|2 (где E – единичная матрица, а вектор v=v(n) свойство ортогональности HT=H-1
Проверить для матрицы H=E-vvT/|v|2 (где E – единичная матрица, а вектор v=v(n)) свойство ортогональности HT=H-1 помогите ...

Даны квадратные матрицы A, B порядка n Получить матрицу N=B(A*E), где E- единичная матрица
Даны квадратные матрицы A, B порядка n. Получить матрицу N=B(A*E), где E- единичная матрица. Все матрицы вывести на печать.

Получить матрицу A(B-E)+C, где Е-единичная матрица порядка n, а элементы матрицы C вычисляются по формуле
Даны квадратные матрицы А и В порядка n. Получить матрицу A(B-E)+C, где Е-единичная матрица порядка n, а элементы матрицы C вычисляются по...

Вывод процедуры.Даны кв.матрицы A,B, получить матрицу A*(B-E)+C , E-единичная матрица
Помогите вывести процедуру. Выдает ошибку Illegal type in Write/Writeln statement . Не умею преобразовывать типы.. program Pr10; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru