Я изо всех сил пытаюсь придумать алгоритм для вывода 3D-массива. В основном у меня есть массив из 9 2D-массивов, которые мне нужно объединить в сетку 3X3 и вывести в текстовый файл в виде матрицы. Так что я:
real:: array3D(9,16,16)
И мне нужно последовательно (слева направо, сверху вниз) объединить эти 9 массивов 16x16 в сетку 3x3:
real:: array2D(48,48)
Любая помощь будет здорово.
[Изменить: информация для комментариев]: это часть программы MPI, в которой матрица 48x48 разбивается на 9 матриц 16x16, где каждый из 9 процессов назначается одной «подсетке» большего массива. Подобно сетке судоку, как упоминалось в комментариях, где каждый процесс применяет формулу к каждому элементу в своей собственной подсетке. Окончательные значения, рассчитанные каждым процессом, затем необходимо поместить обратно в матрицу 48x48, чтобы отобразить их в текстовом файле. В настоящее время это выглядит так:
if(procID.ne.0)then!Send all arrays to root
call MPI_SEND (array, row*col, MPI_REAL, 0, procID+1000, MPI_COMM_WORLD, ierr)
else
complete(1,:,:)=array(:,:)
do i=2, 9
call MPI_RECV (recvArray, row*col, MPI_REAL, i-1, (i-1)+1000, MPI_COMM_WORLD, status, ierr)
complete(i,:,:)=recvArray
end do
То, что я пытаюсь получить, - это алгоритм, который я могу использовать для отображения complete
в текстовом файле в виде матрицы таким образом, чтобы мне было удобно читать. (Я знаю, что имена переменных отличаются от приведенных выше, но я попытался максимально упростить/обобщить свою первоначальную проблему. Здесь array
снова имеет размеры 48x48
, но меня интересует только блок 16x16
внутри каждого (9 головоломок судоку, только хочу одна подсетка от каждого), какой блок 16x16, который я хочу, определяется первыми индексами complete
/array3D
:1-9, я хочу взять эти подблоки и расположить их в другом массиве 48x48
, скажем, arrayOut
/array2D
). Я постараюсь представить графическое объяснение проблемы, когда у меня будет возможность, если то, что я написал, не имеет особого смысла.
Спасибо @george, чей ответ приведен ниже, чтобы поместить это в массив, который вам нужен:
do majorRow=1,3
do majorCol=1,3
subBlock=(majorRow-1)*3+majorCol
do minorRow=majorRow*16-(16-1),majorRow*16
do minorCol=majorCol*16-(16-1),majorCol*16
outArray(minorRow,minorCol)=complete(subBlock,minorRow,minorCol)
end do
end do
end do
end do
array2d(1:16,1:16)=array3d(1,1:16,1:16)
, затемarray2d(1:16,17:32)=array3d(2,1:16,1:16)
и так далее. - person Kyle Kanos   schedule 09.01.2014mod
, чтобы разделить ваше 9-мерное измерение на фрагменты 3x3. Или вы можете использовать массив поиска для новых координат строки и столбца. - person M Oehm   schedule 09.01.20141+(n-1)*16:16+(n-1)*16
, гдеn
— первый индекс вarray3d
, будет работать для первых трех, вам, вероятно, придется использоватьmod
, чтобы получить следующие три. - person Kyle Kanos   schedule 09.01.20143x3
, о котором он упоминал, кажется отдельной переменной из массивов9x16x16
и48x48
. - person Kyle Kanos   schedule 09.01.201416x16
массивов, которые я хотел бы расположить в порядке от 1 до 9, как они будут отображаться в головоломке судоку, а затем вывести двумерный массив в текстовый файл. Я думаю, чем меньше циклов, тем лучше, но пока результат правильный на этом этапе, я не возражаю :) - person WireInTheGhost   schedule 10.01.2014mpi_scatterv
иmpi_gatherv
Здесь слишком поздно для меня, чтобы предоставить какую-либо дополнительную помощь, но посмотрите на ответ Джонатана Дурси здесь: stackoverflow.com/questions/9269399/ - person High Performance Mark   schedule 10.01.2014