Умножить часть массива как матрицу, используя matmul - PullRequest
1 голос
/ 01 декабря 2011

Мой вопрос похож на этот Умножьте 3D-матрицу на 2D-матрицу . Тем не менее, я пишу код на Фортране.

Скажите, если у меня есть RxSxT матрица A и SxU матрица B, где R,S,T,U - целые числа, и я хочу умножить A(:,:,0) на B. Как я могу сделать это с matmul? Когда я делаю что-то вроде

    C(:,:,0) = matmul(A(:,:,0),B)

Компилятор (gfortran) выдает:

    Warning:Array reference at (1) is out of bounds (0 < 1) in dimension 3 
    f951: internal compiler error: Segmentation fault

Есть ли способ обойти это? Спасибо.

РЕДАКТИРОВАТЬ: я должен добавить, что я на самом деле транспонировать вторую матрицу. Скажем, матрица A a RxSxT и матрица B a UxS. Тогда

 C(:,:,0) = matmul(B,transpose(A(:,:,0))

Это транспонирование может быть частью проблемы. Преобразует ли оно A (i, j, k) в A (k, i, j)?

Ответы [ 2 ]

8 голосов
/ 01 декабря 2011

Помните, что в Fortran индексы вашего массива начинаются с 1 по умолчанию.Поэтому, если вы не указали для массива A нижнюю границу не по умолчанию в 3-м измерении, gfortran будет совершенно правильно указывать на вашу ошибку.

Конечно, внутренняя ошибка компилятора всегда является ошибкой компилятора;если у вас нет какой-то древней версии gfortran, пожалуйста, сообщите об ошибке на http://gcc.gnu.org/bugzilla

2 голосов
/ 01 декабря 2011

transpose (A (:,:, 0)) должен поменять местами индексы A (i, j, 0) на A (j, i, 0). A (:,:, 0) - матрица ранга два.

Компилятор никогда не должен падать, независимо от того, верен ли исходный код или нет. Используете ли вы последнюю версию Gfortran? Вы можете сообщить об этой «внутренней ошибке компилятора: ошибка сегментации» команде разработчиков gfortran: http://gcc.gnu.org/wiki/GFortran#bugs

...