Вот написал процедурку для поворота матрицы. Правильно ли я это сделал и можно ли обойтись без число_строк х число_столбцов умножений? это_матрица? dd 1,2,3 dd 4,5,6 dd 7,8,9 dd 10,11,12 Как переделать процедуру, чтобы она поворачивала матрицу не в другое место памяти, а в то же? Желательно без выделения дополнительной памяти. Какие приемы обработки матриц больше всего необходимы в программировании, какие менее, а какие вообще вряд ли где используются? 566749134__matrixrotate.zip
alterego Держи! Хм. FASM и на такое способен - писать комментарии без ";" _1999827199__matrixrotate.zip
dr_dred Даже исходники смотреть не буду. Что значит в то же место? Тебе 64 байта памяти жалко? Такими вопросами сейчас никто не задается. Ради производительности десятками и сотнями мегабайт жертвуют, а ты в 64 байта закомплексовал.
_DEN_ Считаешь плохо Мне памяти не жалко, просто при повороте больших матриц и так делается mn умножений, а еще память выделять и потом в исходную матрицу копировать... Хватит ли для этого стека? Как память побыстрее выделить, если стека не хватит?
dr_dred В аттаче процедура, поворачивающая прямоугольную матрицу "in situ". Написана на Fortran 90, но думаю разберешься _588205170__toms513.f90
dr_dred Успокойся и подыши Неинициализированные данные. ??? n-меное пространство чтоли? Бред какой. Тебе что, миллион матриц в секунду поварачивать надо чтоли?
_DEN_ Не то. Неизвестно какая матрица будет поворачиваться: 2х2 или 100х100. На какой "квадрат" стека хватит, если нет, как побыстрее память выделить.
dr_dred Попробуй такой код Код (Text): ;===================================================================== matrix_src dd 1,2,3 dd 4,5,6 dd 7,8,9 dd 10,11,12 matrix_dst rd 12 m dd 4 n dd 3 ;===================================================================== entry $ xor ecx,ecx mov ebp,[m] mov ebx,[n] @1: mov edx,ebp @@: mov eax,[matrix_src+ecx*4] mov [matrix_dst+edx*4-4],eax add ecx,1 add edx,[m] cmp ecx,ebx jnz @b add ebx,[n] dec ebp jnz @1 ;=====================================================================
bogrus Мой ответ: Код (Text): entry $ xor ecx,ecx mov ebp,[n] mov ebx,[m] @1: mov edx,ebp @@: mov eax,[matrix_src+edx*4-4] mov [matrix_dst+ecx*4],eax add ecx,1 add edx,[n] cmp ecx,ebx jnz @B add ebx,[m] dec ebp jnz @1 аналогично, но для поворота против часовой стрелки. Найдите 8 отличий Stiver Что это делает конкретно? Разобраться не могу, там переменных - миллион, и не понятно зачем что нужно.
Код (Text): ;===================================================================== entry $ mov edx,[n] @1: mov eax,edx mov ecx,[m] @@: push [matrix_src+eax*4-4] add eax,[n] loop @B dec edx jnz @1 ; lea ecx,[eax-1] ;@@: pop dword[matrix_src+ecx*4-4] ; loop @B или ;;; dec eax ;;;@@: pop dword [matrix_src+ecx*4] ;;; inc ecx ;;; cmp ecx,eax ;;; jb @B ;===================================================================== где ; - для поворота матрицы на -90 градусов, где ;;; - на +90 градусов. Ваши мнения?
dr_dred Я тебя неправильно понял, думал тебе нужно транспонирование матрицы, а не простой поворот, извини
Stiver Да извиняться не за чего. Транспонирование - нечего делать. Этот вариант первый, переделаю под bogrus'a попозже. Код (Text): MatrixTransp proc uses ebx esi edi,lpMatrix1,lpMatrix2,m,n mov esi,[lpMatrix1] mov edi,[lpMatrix2] xor ebx,ebx .while ebx<[m] xor edx,edx .while edx<[n] mov ecx,edx imul ecx,dword [m] add ecx,ebx lodsd mov dword [edi+ecx*4],eax inc edx .endw inc ebx .endw ret MatrixTransp endp