Поворот Матрицы

Тема в разделе "WASM.A&O", создана пользователем dr_dred, 9 авг 2005.

  1. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Вот написал процедурку для поворота матрицы. Правильно ли я это сделал и можно ли обойтись без число_строк х число_столбцов умножений?



    это_матрица? dd 1,2,3

    dd 4,5,6

    dd 7,8,9

    dd 10,11,12



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

    [​IMG] 566749134__matrixrotate.zip
     
  2. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Написал бы на С - на С понятнее.
     
  3. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    alterego

    Кому как, если не понятно, могу комментариями снабдить?
     
  4. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    alterego

    Держи!

    Хм. FASM и на такое способен - писать комментарии без ";"

    [​IMG] _1999827199__matrixrotate.zip
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    dr_dred



    Даже исходники смотреть не буду. Что значит в то же место? Тебе 64 байта памяти жалко? Такими вопросами сейчас никто не задается. Ради производительности десятками и сотнями мегабайт жертвуют, а ты в 64 байта закомплексовал.
     
  6. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    _DEN_



    Считаешь плохо :)

    Мне памяти не жалко, просто при повороте больших матриц и так делается mn умножений, а еще память выделять и потом в исходную матрицу копировать...

    Хватит ли для этого стека? Как память побыстрее выделить, если стека не хватит?
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    dr_dred





    В аттаче процедура, поворачивающая прямоугольную матрицу "in situ". Написана на Fortran 90, но думаю разберешься :)

    [​IMG] _588205170__toms513.f90
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    dr_dred



    Успокойся и подыши :)







    Неинициализированные данные.







    ??? n-меное пространство чтоли?







    Бред какой. Тебе что, миллион матриц в секунду поварачивать надо чтоли?
     
  9. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    _DEN_



    Не то. Неизвестно какая матрица будет поворачиваться: 2х2 или 100х100.

    На какой "квадрат" стека хватит, если нет, как побыстрее память выделить.
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    dr_dred Попробуй такой код
    Код (Text):
    1. ;=====================================================================
    2. matrix_src  dd      1,2,3
    3.             dd      4,5,6
    4.             dd      7,8,9
    5.             dd      10,11,12
    6. matrix_dst  rd      12
    7. m           dd      4
    8. n           dd      3
    9. ;=====================================================================
    10. entry       $
    11.             xor     ecx,ecx
    12.             mov     ebp,[m]
    13.             mov     ebx,[n]
    14. @1:         mov     edx,ebp
    15. @@:         mov     eax,[matrix_src+ecx*4]
    16.             mov     [matrix_dst+edx*4-4],eax
    17.             add     ecx,1
    18.             add     edx,[m]
    19.             cmp     ecx,ebx
    20.             jnz     @b
    21.             add     ebx,[n]
    22.             dec     ebp
    23.             jnz     @1
    24. ;=====================================================================
     
  11. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    bogrus





    [Нет слов]
     
  12. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    bogrus

    Мой ответ:
    Код (Text):
    1. entry   $
    2.         xor     ecx,ecx
    3.         mov     ebp,[n]
    4.         mov     ebx,[m]
    5. @1:     mov     edx,ebp
    6. @@:
    7.         mov     eax,[matrix_src+edx*4-4]
    8.         mov     [matrix_dst+ecx*4],eax
    9.         add     ecx,1
    10.         add     edx,[n]
    11.         cmp     ecx,ebx
    12.         jnz     @B
    13.         add     ebx,[m]
    14.         dec     ebp
    15.         jnz     @1




    аналогично, но для поворота против часовой стрелки. Найдите 8 отличий :)



    Stiver

    Что это делает конкретно? Разобраться не могу, там переменных - миллион, и не понятно зачем что нужно.
     
  13. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Код (Text):
    1. ;=====================================================================  
    2. entry   $
    3.         mov     edx,[n]
    4. @1:     mov     eax,edx
    5.         mov     ecx,[m]
    6. @@:     push    [matrix_src+eax*4-4]
    7.         add     eax,[n]
    8.         loop    @B
    9.         dec     edx
    10.         jnz     @1
    11.  
    12. ;        lea     ecx,[eax-1]
    13. ;@@:     pop     dword[matrix_src+ecx*4-4]
    14. ;        loop    @B
    15. или
    16. ;;;        dec     eax
    17. ;;;@@:     pop     dword [matrix_src+ecx*4]
    18. ;;;        inc     ecx
    19. ;;;        cmp     ecx,eax
    20. ;;;        jb      @B
    21. ;=====================================================================  




    где ; - для поворота матрицы на -90 градусов, где ;;; - на +90 градусов. Ваши мнения?
     
  14. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    dr_dred



    Я тебя неправильно понял, думал тебе нужно транспонирование матрицы, а не простой поворот, извини :)
     
  15. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Stiver

    Да извиняться не за чего.



    Транспонирование - нечего делать. Этот вариант первый, переделаю под bogrus'a попозже.


    Код (Text):
    1. MatrixTransp proc uses ebx esi edi,lpMatrix1,lpMatrix2,m,n
    2.  
    3.         mov     esi,[lpMatrix1]
    4.         mov     edi,[lpMatrix2]
    5.         xor     ebx,ebx
    6.         .while  ebx<[m]
    7.                 xor     edx,edx
    8.                 .while  edx<[n]
    9.                         mov     ecx,edx
    10.                         imul    ecx,dword [m]
    11.                         add     ecx,ebx
    12.  
    13.                         lodsd
    14.                         mov     dword [edi+ecx*4],eax
    15.                         inc     edx
    16.                 .endw
    17.                 inc     ebx
    18.         .endw
    19.         ret
    20.  
    21.  
    22. MatrixTransp endp