Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Транспонирование матрицы, хранящейся в одномерном массиве 
V
    Опции темы
Alagert
Дата 8.1.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Есть прямоугольная матрица, нужно ее траспонировать на месте.
Матрица записана построчно в одномерный массив. Для траспонирования нужно использовать этот же массив и можно еще некоторое количество переменных, число которых не зависит от размерности матрицы. Со слов моего препода, понял, что их должно быть 1 или 2.

Погите плиз разобраться с этой задачей, очень нужно!
Всем спасибо!
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
maxim1000
Дата 8.1.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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

пример:
матрица 2х3 (в одномерном представлении): 1, 2, 3; 4, 5, 6
1-й шаг: смотрим на первый элемент - это (1,1) его не надо менять (так всегда будет на первом шаге)
2-й шаг: смотрим на второй элемент - это (1,2): там стоит 2, а должно быть 4, меняем их местами
и так далее

на самом деле, если подумать, то алгоритм поиска можно будет заменить на просто вычисление какого-нибудь аналитического выражения, но думать лень smile


--------------------
qqq
PM WWW   Вверх
Illuminaty
Дата 8.1.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 1
Всего: 56



а - массив [0..n], где n = m*m - 1, где m - размерность матрицы
temp - переменная
транспонирование:
Код
for (i = 0; i < n; i ++) {
  for (j = 0; j < i - 1; j++) {
    temp = a[i*n + j];
    a[i*n + j] = a[j*n + i];
    a[j*n + i] = temp;
  }
}


Это сообщение отредактировал(а) Illuminaty - 8.1.2006, 15:26
PM MAIL ICQ   Вверх
Alagert
Дата 8.1.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Illuminaty @ 8.1.2006, 15:25)
а - массив [0..n], где n = m*m - 1, где m - размерность матрицы
temp - переменная
транспонирование:
Код
for (i = 0; i < n; i ++) {
  for (j = 0; j < i - 1; j++) {
    temp = a[i*n + j];
    a[i*n + j] = a[j*n + i];
    a[j*n + i] = temp;
  }
}

Твой вариант проходит для квадратных матриц. С ним все ясно.
А как быть с прямоугольной матрицей?
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
Illuminaty
Дата 8.1.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 1
Всего: 56



Alagert, двойку тебе по алгебре в зачетку поставить надо smile
Прямоугольные матрицы не транспонируются
PM MAIL ICQ   Вверх
Alagert
Дата 8.1.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Illuminaty @ 8.1.2006, 16:53)
Alagert, двойку тебе по алгебре в зачетку поставить надо smile
Прямоугольные матрицы не транспонируются

У меня 5 по матану за все курсы smile
Прямоугольная матрица замечательно траспонируется! Была матрица MxN, а стала NxM.
Прямоугольные матрицы не обращаются(если не рассматривать случай псевдообратных матриц)


--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
Illuminaty
Дата 8.1.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 1
Всего: 56



Цитата(Alagert @ 8.1.2006, 18:00 Найти цитируемый пост)

У меня 5 по матану за все курсы
Тогда и флаг тебе в руки smile
PM MAIL ICQ   Вверх
Illuminaty
Дата 8.1.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 1
Всего: 56



Признаю ошибку. Мои 5 по алгебре остались в прошлом веке. Действительно, перепутал с обратными... Позор на мою седую голову... Ладно хоть преподаватель не видит по алгебре - его бы удар хватил smile
В связи с этим помогу с алгоритмом, но через некоторое время...
PM MAIL ICQ   Вверх
Alagert
Дата 8.1.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Illuminaty @ 8.1.2006, 17:54)
Признаю ошибку. Мои 5 по алгебре остались в прошлом веке. Действительно, перепутал с обратными... Позор на мою седую голову... Ладно хоть преподаватель не видит по алгебре - его бы удар хватил smile
В связи с этим помогу с алгоритмом, но через некоторое время...

Всем свойственно ошибаться. Огромное спасибо за обещание помочь.
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
Mal Hack
Дата 8.1.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Alagert тут надо еще уже со стороны языка думать, т.к. при транспонировании мтрица получается другой размерности, надо это предусматривать в объявлении переменных.
На не надо проссматривать каждый элемент, также можно исключить мнимую диагональ.

Код
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
 mm : array[1..10] of array[1..10] of integer;
 c,n,m,i,j:integer;
 per : boolean = false;
begin
 n := 4;
 m := 1;

 for i := 1 to n do
  begin
   for j := 1 to m do
    begin
     mm[i,j] := random(10);
     write( mm[i,j]: 4 );
    end;
   writeln;
  end;

 writeln;

 if n > m then
  begin
   c := n;
   n := m;
   m := c;
   per := true;
  end;

 for i := 1 to n do
  for j := i + 1 to m do
   begin
    c := mm[i,j];
    mm[i,j] := mm[j,i];
    mm[j,i] := c;
   end;

 if per = true then
  begin
   c := n;
   n := m;
   m := c; 
  end;

 for i := 1 to m do
  begin
   for j := 1 to n do
    write( mm[i,j]: 4 );

   writeln;
  end;


 readln; 
end.

PM ICQ   Вверх
Illuminaty
Дата 8.1.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 1
Всего: 56



Mal Hack, прочитай условие внимательно
Цитата(Alagert @ 8.1.2006, 15:30 Найти цитируемый пост)

Матрица записана построчно в одномерный массив.


PM MAIL ICQ   Вверх
Mal Hack
Дата 8.1.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Illuminaty массив массива строк. Или имеется ввиду вектор?
PM ICQ   Вверх
Alagert
Дата 8.1.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 25.8.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Mal Hack @ 8.1.2006, 20:42)
Illuminaty массив массива строк. Или имеется ввиду вектор?

Для простоты есть интовый массив размерности m*n, туда построчно записана вся матрица.
--------------------
[color=blue]BORN TO BE ROOT#[/color]  
PM MAIL ICQ   Вверх
maxim1000
Дата 8.1.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
Mal Hack
Дата 8.1.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Работает когда m > n, щас думаю над обратным случаем...
Код
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
 mm : array[1..50] of integer;
 c,n,m,i,j:integer;
begin
 n := 3;
 m := 3;
 
 for i := 1 to n do
  begin
   for j := 1 to m do
    begin
     mm[(i-1)*m+j] := random(10);
     write( mm[(i-1)*m+j]: 4 );
    end;
   writeln;
  end;

 writeln;

 for i := 1 to n do
  for j := i + 1 to m do
   begin
    c := mm[(i-1)*m+j];
    mm[(i-1)*m+j] := mm[i+(j-1)*m];
    mm[i+(j-1)*m] := c;
   end;

 for i := 1 to m do
  begin
   for j := 1 to n do
    write( mm[(i-1)*m+j]: 4 );

   writeln;
  end;


 readln; 
end.



Это сообщение отредактировал(а) Mal Hack - 8.1.2006, 21:52
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.