Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2013, 19:05   #1
PinkPink
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 98
По умолчанию Обработка матриц

Народ, что за нафиг. Почему-то меняются значения матрицы и всё тут! Хотя я её не трогаю.
Вот код.
Код:
//библиотеки
namespace modul_for_cognitive_maps
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            int rows = 7;
        List<List<double>> matrix = new List<List<double>>();
            //проинициализируем всю матрицу нулями
            zero(matrix,rows);
            matrix[0][2] = 0.6;
            matrix[0][3] = 0.9;
            matrix[1][0] = 1.0;
            matrix[2][1] = 0.7;
            matrix[2][4] = 0.9;
            matrix[3][6] = 0.9;
            matrix[4][5] = -0.9;
            matrix[4][6] = -0.9;
            matrix[5][0] = -0.3;
            matrix[6][5] = 0.8;
            // Шаг первый. Проверяем типа алгоритма в зависимости от знаков элементов
            
                otric_alg(matrix, rows);
        }
 
        void otric_alg(List<List<double>> matrix, int rows)
        {
            List<List<double>> double_table = new List<List<double>>();
            zero(double_table, rows*2);
            //составляем таблицу
            double_table =  create_double_table(matrix, double_table,rows);
//получили матрицу по специальному алгоритму, что  не так важно
            //создаём матрицу для умножения
            List<List<double>> res_matrix = new List<List<double>>();
            List<List<double>> tranz_zamkn_matrix = new List<List<double>>();//транзитивно-замкнутая матрица
            res_matrix = double_table;
            tranz_zamkn_matrix = res_matrix;
            //умножаем всё с помощью обычного транзитивного замыкания
 
            for (int i = 0; i < rows * 2; i++)
            {
                res_matrix = multi_matrix(double_table, res_matrix, rows * 2);//умножение 
                tranz_zamkn_matrix = maksimil_matrix(res_matrix, tranz_zamkn_matrix,rows*2);//сравнение
            }
 
        }
        
 
        void zero(List<List<double>> matrix, int rows)
        {
            for (int i = 0; i < rows; i++)
            {
                List<double> row = new List<double>();
                for (int j = 0; j < rows; j++)
                {
                    row.Add(0);
                }
 
                matrix.Add(row);
            }
        }
 
    
        List<List<double>> maksimil_matrix(List<List<double>> matrix, List<List<double>> res_matrix, int columns)
        {
 
            for (int i = 0; i < columns; i++)//цикл по строкам первой матрицы
            {
                for (int j = 0; j < columns; j++)//цикл по столбцам второй матрицы
                {
                    if (matrix[i][j] > res_matrix[i][j]) res_matrix[i][j] = matrix[i][j];
                }
            }
            return res_matrix;
        }
 
        List<List<double>> multi_matrix(List<List<double>> matrix, List<List<double>> res_matrix, int columns)
        {
            List<List<double>> ret_matrix = new List<List<double>>();//используем в процессе вычисления
            zero(ret_matrix,columns);
            double res_umn = 0;
            for (int i = 0; i < columns; i++)//цикл по строкам первой матрицы
            {
                for (int j = 0; j < columns; j++)//цикл по столбцам второй матрицы
                {
                    for (int l = 0; l < columns; l++)//цикл по элементам столбцов второй матрицы
                    {
                        res_umn += matrix[i][l] * res_matrix[l][j];
                    }
                    ret_matrix[i][j] = res_umn;//перемножили строчку на j-ый столбец
                    res_umn = 0;
                }
            }
            return ret_matrix;
        }
 
    }
}
после вызова maksimil_matrix меняются значения double_table, хотя я не трогала эту матрицу вообще в этом вызове! Ничего не понимаю. Помогите пожалуйста!
PinkPink вне форума Ответить с цитированием
Старый 10.04.2013, 19:25   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

как-же не трогали ... а это что : res_matrix[i][j] = matrix[i][j]; ?
eval вне форума Ответить с цитированием
Старый 10.04.2013, 19:55   #3
PinkPink
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 98
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
как-же не трогали ... а это что : res_matrix[i][j] = matrix[i][j]; ?
так я присваиваю res_matrix-у значение, а не double_table
PinkPink вне форума Ответить с цитированием
Старый 10.04.2013, 20:29   #4
PinkPink
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 98
По умолчанию

народ, ну помогите, извелась уже вся
PinkPink вне форума Ответить с цитированием
Старый 10.04.2013, 20:54   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
    res_matrix = double_table;
    tranz_zamkn_matrix = res_matrix;
tranz_zamkn_matrix <=> double_table
Код:
for (..) {
..
    tranz_zamkn_matrix = maksimil_matrix(res_matrix, tranz_zamkn_matrix,rows*2);
}
maksimil_matrix(res_matrix, tranz_zamkn_matrix,rows*2);
<=>
maksimil_matrix(res_matrix, double_table,rows*2);
netrino вне форума Ответить с цитированием
Старый 10.04.2013, 21:10   #6
PinkPink
Пользователь
 
Регистрация: 09.10.2011
Сообщений: 98
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Код:
    res_matrix = double_table;
    tranz_zamkn_matrix = res_matrix;
tranz_zamkn_matrix <=> double_table
Код:
for (..) {
..
    tranz_zamkn_matrix = maksimil_matrix(res_matrix, tranz_zamkn_matrix,rows*2);
}
maksimil_matrix(res_matrix, tranz_zamkn_matrix,rows*2);
<=>
maksimil_matrix(res_matrix, double_table,rows*2);
не понимаю почему это одно и тоже? я пыталась присвоить матрицам те же значения..
как тогда присваивать значения? гонять цикл? почему так?
почему кстати double_table и res_matrix не равны?

Последний раз редактировалось PinkPink; 10.04.2013 в 21:26.
PinkPink вне форума Ответить с цитированием
Старый 10.04.2013, 22:28   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

C# - язык с ссылочной семантикой для классов, то есть, когда Вы присваиваете объект класса переменной, то происходит лишь присваивание ссылки на этот объект. Так что выходит, что в определённый момент три переменные (double_table, res_matrix и traпочему кстати double_table и res_matrix не равны?nz_zamkn_matrix) являются ссылками на один и тот же объект. Естественно, модифицируя объект по одной из ссылок, Вы получаете изменённый объект по каждой из ссылающихся на него переменных.

Цитата:
Сообщение от PinkPink
почему кстати double_table и res_matrix не равны?
Потому что
Код:
res_matrix = multi_matrix(double_table, res_matrix /* double_table */, rows * 2);//умножение
Но до этого присваивания, res_matrix и double_table ссылаются на один объект, да.

Последний раз редактировалось netrino; 11.04.2013 в 06:24.
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка Матриц(Упорядочивание Элементов,Вывод На Экран Матриц При Условии...) timepoka Помощь студентам 8 01.07.2011 13:20
Подпрограммы и обработка матриц stepan-rkt Паскаль, Turbo Pascal, PascalABC.NET 0 18.05.2011 22:38
обработка матриц в с++ прянька Помощь студентам 1 22.11.2009 23:40
Подпрограммы и обработка матриц Pravednik Помощь студентам 3 20.01.2008 14:41