Как удалить случайные строки из матрицы в Fortran90

Итак, вот в чем проблема. В моем задании я должен создать матрицу (31000), а после ее создания я должен СЛУЧАЙНО удалить 271 строку матрицы. В конце я должен получить матрицу (3729) со всеми начальными значениями, кроме того, которое я удалил, соответствующее случайным числам.

Для этого я написал этот скрипт, где Мк=1000 N=729

h=1
do a=1, (Mc-N)

   call random_number(rand_num)
   rand_num=int(rand_num*Mc)-1
   !print*, rand_num

   do b=1, Mc

      if (b /= rand_num) then

      NMatrix(:,h) = Matrix(:,b)

      h=h+1

      else

      h=h

      endif
    enddo
enddo

Но когда я запускаю его, он сообщает мне об этой ошибке: Program receiver signal SIGABRT : Process abort signal. Что я должен делать? Пожалуйста, это очень важно

Я знаю, что есть некоторые проблемы с циклами do и памятью массивов, но я не могу добраться до сути. Не могли бы вы спросить меня?

При первом проходе через цикл b вы добавили в новую матрицу не менее 999 строк. В следующем проходе вы добавили еще 999 строк... и так далее. У вас довольно быстро закончится матрица или память. Кроме того, "h=h" является ненужным утверждением.

lastchance 16.02.2023 12:13

Пожалуйста, опубликуйте полный минимально воспроизводимый пример. В вашем коде есть несколько очевидных недостатков, но способ их исправления зависит от отсутствующих фрагментов кода (например, от того, как объявлены матрицы).

PierU 16.02.2023 14:11

По соглашению элемент матрицы a(i,j) указывает i-ю строку и j-й столбец. В вашем случае вы удаляете 271 столбец, а не 271 строку.

John Alexiou 17.02.2023 00:00
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пример того, что вы просите (я думаю).

rows=3, cols=1000
1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.00 11.00 12.00 ...
1001. 1002. 1003. 1004. 1005. 1006. 1007. 1008. 1009. 1010. 1011. 1012. ...
2001. 2002. 2003. 2004. 2005. 2006. 2007. 2008. 2009. 2010. 2011. 2012. ...

rows=3, cols=729
1.000 3.000 4.000 9.000 10.00 11.00 12.00 13.00 14.00 16.00 17.00 19.00 ...
1001. 1003. 1004. 1009. 1010. 1011. 1012. 1013. 1014. 1016. 1017. 1019. ...
2001. 2003. 2004. 2009. 2010. 2011. 2012. 2013. 2014. 2016. 2017. 2019. ...

Обратите внимание, что по соглашению 1-й индекс — это строки, а 2-й индекс — это столбцы. Итак, вы просите удалить 271 столбец из матрицы.

Я решил использовать массив значений индекса indx=[1,2,3,4 .. n], который я перемешиваю случайным образом, затем отсекаю последние 271 значение (сохраняя n записи), а затем сортирую обратно в порядке возрастания.

Наконец, результат по существу NMatrix(:,:) = Matrix(:, indx) или, в моем случае, я называю их a и b в своей функции.

function RemoveRandomColumns(a,n_col) result(b)
real, intent(in) :: a(:,:)
integer, intent(in) :: n_col
real, allocatable :: b(:,:)
integer :: i,j,n,m,t
integer, allocatable :: indx(:)
real :: u !used in shuffle part
m = size(a, 1)
n = size(a, 2)
! must remove m-n_col columns from a
allocate(indx(n))
indx = [ (i,i=1,n) ]
! indx = [1,2,3,4,5,6,7,8,..,n]

! suffle the index
call RANDOM_SEED()
do i=1, n
    call RANDOM_NUMBER(u)
    j = 1 + floor(u*(n-1))
    t = indx(i)
    indx(i) = indx(j)
    indx(j) = t
end do
! indx = [18,10,3,16,21,...]

! take only n_col items
indx = indx(1:n_col)
! indx = [18,10,3,...]

! sort the index
do i=1, n_col
    do j=1, i-1
        if (indx(i)<indx(j)) then
            t = indx(i)
            indx(i) = indx(j)
            indx(j) = t
        end if
    end do
end do
! indx = [2,3,4,6,7,9,..,n]

! now slice the array to get the resukt
allocate(b(m,n_col))
do j=1, m
    b(j,:) = a(j,indx)
end do
end function

И пример кода для проверки вышеизложенного

program FortranProgram1
use, intrinsic :: iso_fortran_env
implicit none

integer, parameter :: Mc = 1000, n = 729

! Variables
real :: matrix(3, Mc)
real :: reduced(3, n)
integer :: i,j

do j=1, 3
    do i=1, Mc
        matrix(j,i) = real(Mc*(j-1)+i)
    end do
end do

print '("rows = ",g0,", cols = ",g0)', size(matrix,1), size(matrix,2)
print '(*(g0.4," "))', matrix(1,1:12), "..."
print '(*(g0.4," "))', matrix(2,1:12), "..."
print '(*(g0.4," "))', matrix(3,1:12), "..."

print *, ""

reduced = RemoveRandomColumns(matrix, n)

print '("rows = ",g0,", cols = ",g0)', size(reduced,1), size(reduced,2)
print '(*(g0.4," "))', reduced(1,1:12), "..."
print '(*(g0.4," "))', reduced(2,1:12), "..."
print '(*(g0.4," "))', reduced(3,1:12), "..."

contains

function RemoveRandomColumns(a,n_col) result(b)
...
end function

end program

Другие вопросы по теме