where (mymatrix==0) mymatrix = 100.0d0
установит все элементы в mymatrix, которые равны от 0 до 100. Если вы на самом деле пытаетесь сделать что-то более сложное, чем это, возможно, установив матрицу, чтобы иметь «шахматную доску» из 1 и 0, вы можете попробоватьчто-то вроде;
mymatrix(1:m:2,2:n:2) = 100d0
где m, n - номера строк и столбцов в mymatrix.Я не проверял этот последний фрагмент, это просто предложение иногда рассматривать триплеты индекса массива.
РЕДАКТИРОВАТЬ
Если вы действительно хотите использовать одну матрицу (или вектор) в качестве маски в операторе where, а другую - в части присваивания, т.е. что-то вроде этого:
where(index_matrix==0) mymatrix = 100d0
, тогда вы должны (я думаю) убедиться, что index_matrix
имеет тот же размер, что и mymatrix
,В вашем случае вы могли бы получить такое утверждение, как:
where(reshape([0,1],[3,3],pad=[0,1])==0) mymatrix = 100d0
, опять же, я не проверял это и не ожидаю, что у меня есть правильное изменение формы, но вы, вероятно, можете понятьподробности.
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
Теперь мне трудно следить за вопросом.Оператор
sum0 = sum(iszero==0)
присвоит сумме значение 1, поэтому оператор
mysubmatrix(1:sum0,1:sum0) = mymatrix(iszero==0,iszero==0)
во время выполнения будет выглядеть примерно так:
mysubmatrix(1:1,1:1) = mymatrix(iszero==0,iszero==0)
и я не уверен, что rhs и lhs правильно соответствуют Fortran.Это компилируется?Если да, выполняется ли он правильно (с проверкой границ массива)?
Вы пытаетесь создать submatrix
, который содержит только 0 элементов mymatrix
?Если так, то я думаю, что вам будет тяжело, в общем случае.Если вы не можете определить расположение элементов, которые вы хотите выбрать, в виде индексов или вектора индексов или триплета индекса, то я не вижу, что вы можете создать массив на lhs из массива на rhs.
Если расположение нулей произвольно, то вы можете сделать то, что хотите, сгладив исходный массив до ранга 1 и создав его подрешетку ранга 1, но вы потеряете соответствие между2D-локации и их 1D-аналоги.
FINALLY
Не забывайте, что в Fortran 2003 вы можете использовать указатель для ссылки на подматрицу, определяемую каквекторные или триплетные индексы, например
pointer_to_array => target_array(1:10:2,2:10:2)
, а затем передать pointer_to_array
вокруг.