Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 62, средняя оценка - 4.94
maIn
Сообщений: n/a
#1

Транспонирование матрицы относительно главной и побочной диагоналей - C++

18.10.2009, 01:17. Просмотров 8415. Ответов 19
Метки нет (Все метки)

Подскажите как, транспонировать значения квадратной матрицы, относительно главной и побочной диагоналей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2009, 01:17     Транспонирование матрицы относительно главной и побочной диагоналей
Посмотрите здесь:
Поменять местами элементы главной и побочной диагоналей, симметричные относительно центра матрицы C++
Заменить элементы главной и побочной диагоналей матрицы на минимальный элемент ниже главной диагонали C++
Среднее арифметическое главной и побочной диагоналей матрицы C++
C++ Поменять местами элементы главной и побочной диагоналей матрицы
Среднее арифметическое положительных элементов главной и побочной диагоналей матрицы C++
C++ Переписать поочередно элементы главной и побочной диагоналей матрицы в массив
Найти сумму элементов матрицы, лежащих выше главной и побочной диагоналей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.10.2009, 07:39     Транспонирование матрицы относительно главной и побочной диагоналей #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
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
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main ()
{
    int **mas, n, i,j;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout<<"Ââåäèòå êîëè÷åñòâî ñòðîê ГЁ ñòîëáöîâ Г¬Г*òðèöû: "<< endl;
    cin>>n;
    mas=new int*[n];
 
    for(i=0; i<n; i++)
       mas[i]=new int[n];
    cout<<"Ââåäèòå ýëåìåГ*ГІГ» Г¬Г*òðèöû: "<< endl;
    for(i=0; i<n; i++)
       for(j=0; j<n; j++)
       {
          cout<<"["<<i<<"]["<<j<<"]= ";
          cin>>mas[i][j];
       }
        cout<<"èñõîäГ*Г*Гї Г¬Г*òðèöГ*"<<endl;
    for(i=0; i<n; i++)
        {
       for(j=0; j<n; j++)
          cout<<mas[i][j]<<" ";
          cout<<endl;
        }
    cout<<"Г’Г°Г*Г*Г±ГЇГ®Г*èðîâГ*Г*Г*Гї Г¬Г*òðèöГ* ГЇГ® ГЈГ«Г*ГўГ*îé äèГ*ГЈГ®Г*Г*ëè:"<<endl;
    for(i=0; i<n; i++)
    {
       for(j=0; j<n; j++)
           cout<<mas[j][i]<<" ";
       cout<<endl;
    }
    cout<<"Г’Г°Г*Г*Г±ГЇГ®Г*èðîâГ*Г*Г*Гї Г¬Г*òðèöГ* ГЇГ® ïîáî÷Г*îé äèГ*ГЈГ®Г*Г*ëè:"<<endl;
    for(i=0; i<n; i++)
    {
       for(j=0; j<n; j++)
           cout<<mas[n-1-j][n-1-i]<<" ";
       cout<<endl;
    }
    cout<<endl; 
    return 0; 
}
DimaSoldier
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 31
12.12.2010, 14:40     Транспонирование матрицы относительно главной и побочной диагоналей #3
Кто может переписать на СИ ?
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.12.2010, 14:52     Транспонирование матрицы относительно главной и побочной диагоналей #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
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
#include <stdio.h>
#include <malloc.h>
int main ()
{
    int **mas, n, i,j;
    printf("n= ");
    scanf("%d", &n);
 
    mas=(int**) malloc(n*sizeof(int*)); 
    for(i=0; i<n; i++)
       mas[i]=(int*) malloc(n*sizeof(int));
    for(i=0; i<n; i++)
       for(j=0; j<n; j++)
       {
           printf("[%d][%d]= ", i, j);
           scanf("%d", &mas[i][j]);
       }
        printf("Ishodn matr:\n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            printf("%d ", mas[i][j]);
        printf("\n");
    }
    printf("Transp matr po glavn diag:\n");
    for(i=0; i<n; i++)
        {
       for(j=0; j<n; j++)
            printf("%d ", mas[j][i]);
        printf("\n");
        }
    printf("Transp matr po pobochn diag:\n");
    for(i=0; i<n; i++)
        {
       for(j=0; j<n; j++)
            printf("%d ", mas[n-1-j][n-1-i]);
        printf("\n");
        }
        printf("\n");
    return 0; 
}
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 20:45     Транспонирование матрицы относительно главной и побочной диагоналей #5
Транспонирование матрицы:

C
1
2
3
4
5
6
7
8
9
   int a[n][n];
 
   for(i = 1; i < n; i++)
      for(j = 0; j < i; j++)
      {
         a[i][j] ^= a[j][i];
         a[j][i] ^= a[i][j];
         a[i][j] ^= a[j][i];
      }
Здесь корректнее сказать зеркально отразить матрицу относительно обратной диагонали:

C
1
2
3
4
5
6
7
   for(i = 0; i < n - 1; i++)
      for(j = 0; j < n - 1 - i; j++)
      {
         a[i][j] ^= a[n - 1 - j][n - 1 - i];
         a[n - 1 - j][n - 1 - i] ^= a[i][j];
         a[i][j] ^= a[n - 1 - j][n - 1 - i];
      }
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
01.08.2011, 21:04     Транспонирование матрицы относительно главной и побочной диагоналей #6
Цитата Сообщение от Olga_ Посмотреть сообщение
Транспонирование матрицы:

C
1
2
3
4
5
6
7
8
9
   int a[n][n];
 
   for(i = 1; i < n; i++)
      for(j = 0; j < i; j++)
      {
         a[i][j] ^= a[j][i];
         a[j][i] ^= a[i][j];
         a[i][j] ^= a[j][i];
      }
Выгода от подобных трюков сомнительна
C
1
2
3
4
5
6
7
8
9
   int a[n][n];
 
   for(i = 1; i < n; i++)
      for(j = 0; j < i; j++)
      {
         int tmp = a[i][j];
         a[i][j] = a[j][i];
         a[j][i] = tmp;
      }
либо
C++
1
2
3
4
5
   int a[n][n];
 
   for(i = 1; i < n; i++)
      for(j = 0; j < i; j++)
         std::swap(a[i][j], a[j][i]);
Добавлено через 4 минуты
Да, забыл добавить, что реальное транспонирование в памяти почти никогда не нужно и достаточно просто изменить индексы при использовании, но это уже было в коде valeriikozlov
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 21:12     Транспонирование матрицы относительно главной и побочной диагоналей #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Выгода от подобных трюков сомнительна
C
1
2
3
4
5
6
7
8
9
   int a[n][n];
 
   for(i = 1; i < n; i++)
      for(j = 0; j < i; j++)
      {
         int tmp = a[i][j];
         a[i][j] = a[j][i];
         a[j][i] = tmp;
      }
либо
C++
1
2
3
4
5
   int a[n][n];
 
   for(i = 1; i < n; i++)
      for(j = 0; j < i; j++)
         std::swap(a[i][j], a[j][i]);
Добавлено через 4 минуты
Да, забыл добавить, что реальное транспонирование в памяти почти никогда не нужно и достаточно просто изменить индексы при использовании, но это уже было в коде valeriikozlov
Сомнительного будет мало, если сделать ассемблерную вставку. А использование буфера уже скучно...
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
01.08.2011, 21:18     Транспонирование матрицы относительно главной и побочной диагоналей #8
По мне, так xor ещё более скучен.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 21:20     Транспонирование матрицы относительно главной и побочной диагоналей #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
По мне, так xor ещё более скучен.
На операции XOR очень много криптографических алгоритмов построено, так что не надо тут...
diagon
Higher
1926 / 1192 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 21:25     Транспонирование матрицы относительно главной и побочной диагоналей #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
По мне, так xor ещё более скучен.
Зато с ним самые краткие коды получаются.
Например, вычисление НОД:
C++
1
2
for (int a = 24, b = 42; b^=a^=b^=a%=b ;);
std::cout << a;
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
01.08.2011, 21:26     Транспонирование матрицы относительно главной и побочной диагоналей #11
Цитата Сообщение от Olga_ Посмотреть сообщение
На операции XOR очень много криптографических алгоритмов построено, так что не надо тут...
Я про использование его для обмена. Даже в виде ассемблерной вставки выгоды почти нет.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
01.08.2011, 21:27     Транспонирование матрицы относительно главной и побочной диагоналей #12
Olga_, если не секрет, что вас сподвигло поднять тему 3-х (!!!) годичной давности ?
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 21:31     Транспонирование матрицы относительно главной и побочной диагоналей #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
Olga_, если не секрет, что вас сподвигло поднять тему 3-х (!!!) годичной давности ?
Просто ее до конца-то не решили. В задаче ясно говорилось транспонировать, а не вывести на экран в таком виде, вот и усе.
Kastaneda
01.08.2011, 21:38
  #14

Не по теме:

Цитата Сообщение от Olga_ Посмотреть сообщение
Просто ее до конца-то не решили.
У вас на этом форуме большой простор для деятельности, всмысле подобных тем много

Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 23:18     Транспонирование матрицы относительно главной и побочной диагоналей #15
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я про использование его для обмена. Даже в виде ассемблерной вставки выгоды почти нет.
Это верно, сейчас компьютеры быстро работают, разницы почти никакой. Просто операция полезная. Я не со зла
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
01.08.2011, 23:31     Транспонирование матрицы относительно главной и побочной диагоналей #16
Да я вроде тоже без злорадства. Просто не очень хочется видеть этот явно "олимпиадный" приём в реальных программах. Хотелось бы даже посмотреть на его реализацию в виде ассемблерной вставки, при условии что обмениваемые значения в 2 ячейках памяти. Но максимум что можно с его помощью сэкономить, это 1 регистр, но уж точно не время.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 23:40     Транспонирование матрицы относительно главной и побочной диагоналей #17
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да я вроде тоже без злорадства. Просто не очень хочется видеть этот явно "олимпиадный" приём в реальных программах. Хотелось бы даже посмотреть на его реализацию в виде ассемблерной вставки, при условии что обмениваемые значения в 2 ячейках памяти. Но максимум что можно с его помощью сэкономить, это 1 регистр, но уж точно не время.
int x, y;
asm {
mov eax, x
mov edx, y
xor eax, edx
xor edx, eax
xor eax, edx
mov x, eax
mov y, edx
}
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
01.08.2011, 23:42     Транспонирование матрицы относительно главной и побочной диагоналей #18
Ну а без xor будет так:
int x, y;
asm {
mov eax, x
mov edx, y
mov x, edx
mov y, eax
}
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
02.08.2011, 07:00     Транспонирование матрицы относительно главной и побочной диагоналей #19
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну а без xor будет так:
int x, y;
asm {
mov eax, x
mov edx, y
mov x, edx
mov y, eax
}
Конечно будет так. xor лишь иллюстрирует пример обмена значений между регистрами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 19:04     Транспонирование матрицы относительно главной и побочной диагоналей
Еще ссылки по теме:
Найти среднее арифметическое положительных элементов главной и побочной диагоналей матрицы C++
Заполнить секторы матрицы лежащие влево и вправо от главной и побочной диагоналей C++
C++ Найти максимальные элементы главной и побочной диагоналей матрицы и поменять их местами
Посчитать суммы в четвертях матрицы которые образуются пересечением главной и побочной диагоналей. C++
C++ заполнить секторы матрицы, которые лежат влево и вправо от главной и побочной диагоналей

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

Или воспользуйтесь поиском по форуму:
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
02.08.2011, 19:04     Транспонирование матрицы относительно главной и побочной диагоналей #20
Как вы думаете Olga, кто больше работы делает ваш код или код grizlik78, лишния битовая операция XOR задействует АЛУ, вообще туда сюда для чего, если всё равно результат будет записан в указанную ячейку памяти, если обменивать данные между регистрами то лучше использовать такую инcтрукцию xchg reg, reg | xchg mem, reg | xchg reg, mem
__asm {
mov eax, x
mov edx, y
xchg eax, edx
mov x, eax
mov y, edx
};


Olga, на счёт быстроты сегоднящних компьютеров, они всё равно не так ещё быстры как мы хотим, для простых прикладных задач не критичных ко времени, для этого хватит и Pentium-3/Duron-1 Ghz, закон Мура работает по другой спирали теперь не в увелечение частоты а добавление дополнительных ядер на счёт частоты почти предел расстояние между транзистора не позволяет уже втиснувать дополнительные транзисторы надо же ещё тепло отвождить чтобы камень не сгорел. Продолжу на счёт производительности как вы думаете на сколько web-сервер потокового видео данных имеет загрузку процессора если одновременно просматривают видео реального времени до 500000 пользователей, благо используют распределительные сервера, можно одному supercomputer или mainframe-мам пришлось бы работать гонять терафлопы свои. Вот где во основном нужна производительность, в криптографических приложениях особенно если длинна ключа будет за 512 бит, обработка многополигольных 3D объектов если разрабатывать с учётом SOFTWARE, если с HARDWARE тут уже работа видеоадаптеров, кодирование и декодирование аудио-видео в большом разрешение больше чем у MPEG-4 вот будет круто-тогда, и конечно Базы Данных должны работать максимально быстро особенно сейчас в нашем мультимедийном мире, ладно что-то расписался здесь.
Yandex
Объявления
02.08.2011, 19:04     Транспонирование матрицы относительно главной и побочной диагоналей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru