2012-03-06 2 views
1

это моя программаобработка многих матриц в Фортране

program matrix 
real :: J1(38,38),J2(38,29),J3(29,38),J4(29,29) 
real :: J13(38,1),J23(29,1),J33(1,68),Jac(68,68) 
!!all matrices contains some values except Jac 

Jac=[J1 J2 J13 
    J3 J4 J23 
    J33  ] 
end program matrix 

Теперь я хочу, чтобы поместить все эти матрицы в 1 матрицу Jac (68,68) так, что Jac = [J1 J2 J13 J3 J4 J23 J33] Какой должен быть код fortran..пожалуйста, помогите мне.

+2

Используйте 2 DO-петля (вложенная) перебрать элементы Jac и смещение индекса, чтобы поместить каждый элемент из J1..J33 в их corresponging места в Jac. – milancurcic

+0

Что ты делаешь с этим? Какой-то (угадывание от имени J) вибрационного анализа - матрица жесткости? – Rook

ответ

1

Вам нужно будет перебрать по Жаку и назначить элементы Jx(.,.) на Jac(i,j). Например, это то, как вы назначаете J1 на Jac крайнего левого верхнего блока:

DO i = 1, 38 
    DO j = 1, 38 
    Jac(i,j) = J1(i,j) 
    END DO 
END DO 
10

Или, если вам не нравится писать петлю можно написать;

Jac(1:38,1:38) = J1 
Jac(1:38,39:38+29) = J2 

и пр.

EDIT

Я не могу сказать от того, что вы в курсе, если этот бит будет представлять интерес, но я заключаю уровень знаний Fortran, который не включает в себя это ...

вы можете определить:

real, target :: jac(68,68) 
real, dimension(:,:), pointer :: j1, j2, j3, j4, j13, j23, j33 

и использовать эти подмассивы, как это:

j1 => jac(1:38,1:38) 
j33 => jac(1,:) 

и др.. Таким образом, у вас есть только одна копия данных в памяти, что для таких небольших массивов, вероятно, не имеет значения. И это неправильный подход, если содержимое подмассивов и супер-массива должно быть другим.

3

Чтобы поместить его немного более кратким вы можете также использовать

JAC(1:38, 1:38) = J1 (1:38,1:38) 
JAC(1:38,39:67) = J2 (1:38,1:29) 
JAC(1:38, 68) = J13(1:38, 1) 
JAC(39:67, 1:38) = J3 (1:29,1:38) 
JAC(39:67,39:67) = J4 (1:29,1:29) 
JAC(39:67, 68) = J23(1:29, 1) 
JAC( 68, 1:68) = J33( 1,1:68) 

Если у вас есть большие массивы, где копирование не может быть хорошей идеей, я предлагаю вам написать функцию, которая преобразует индексы автоматически. Для удовольствия я добавил нестандартный тип MATRIX, содержащий все подматрицы без указания его явно ниже. Таким образом, у вас есть

REAL FUNCTION JAC(I,J, JAC_MAT) 
    INTEGER, INTENT(IN) :: I,J 
    TYPE(MATRIX), INTENT(IN) :: JAC_MAT 
    IF(I.LE.38.AND.J.LE.38)THEN 
    JAC = JAC_MAT%J1(I,J) 
    ELSEIF(I.LE.38.AND.J.LE.67)THEN 
    JAC = JAC_MAT%J2(I,J-38) 
    ... 
    ENDIF 
END FUNCTION 
Смежные вопросы