вземете произволни индексни числа от матрица, fortran 90

Търся функция или начин да получа индексните числа на 2D матрица:

моят пример е, че имам A(Ly,Lx), където Ly = 100 и Lx = 100

Искам да получа случаен индексен номер на матрицата, като например: Random_node(A) = (random y, random x)

След това искам да правя това многократно, като имам ограничението, че не искам произволните ми точки да се повтарят или дори да не са близо една до друга след праг от (да кажем) 10 възела на радиус. Матрицата е ойлерова 2D матрица (y,x).

Ясен ли е поне първият въпрос?

Благодаря на всички ви!

Алберт П


person Albert Pa    schedule 31.01.2013    source източник
comment
не можете ли просто да използвате функцията INDEX? people.sc.fsu.edu/~jburkardt/f_src/index/ index.html   -  person Rachel Gallen    schedule 31.01.2013


Отговори (1)


Ето един начин за получаване на произволен набор от местоположения във вашата матрица 100x100. Първо, декларирайте 100x100 матрица от реални числа:

real, dimension(100,100) :: randarray

след това поставете произволно число във всеки елемент от този масив

call random_number(randarray)

Сега, израз като

randarray > 0.9

връща логически масив, съдържащ приблизително 10% истински стойности и 90% неверни. Чрез проследяване на местоположенията на истинските стойности вие имате произволните x-es и y-es, които търсите. Всъщност може изобщо да не се налага да намирате тези местоположения, можете просто да използвате израза в маскирани присвоявания и подобни операции, например

where(randarray>0.9) a = func()

стига, разбира се, func да върне скалар или масив 100x100.

Този подход гарантира, че всяко място е различно от всички останали.

Това обаче не отговаря на вашето ограничение, че „случайните“ местоположения не трябва да са твърде близо едно до друго. Това ограничение, разбира се, е малко несъвместимо със случайността.

Предполагам, че бихте могли да разделите своя масив 100x100 на блокове 10x10 и да изберете на случаен принцип по един елемент във всеки блок. Ще бъде ли това добър компромис между вашите ограничения?

person High Performance Mark    schedule 31.01.2013
comment
изглежда легитимно, Марк, ще го пробвам! - person Albert Pa; 01.02.2013