Фортран: извлечение столбцов и строк из матрицы и использование их как одномерных массивов для умножения

Предположим, у меня есть матрицы A и B, обе имеют размеры n x n. Теперь я хочу рассматривать каждый столбец A как матрицу столбцов ColA(i) [i = 1, n], а каждую строку матрицы B как матрицу строк RowB(j) [j = 1, n].

Теперь можно использовать функцию matmul для построения новой матрицы с именем C, элементы которой находятся путем умножения ColA и RowB для всех возможных значений i и j? Что-то вроде

do i = 1, n
 do j= 1, n
    C(i,j) = matmul( ColA(i), RowB(j) ) 
 end do
end do

person hbaromega    schedule 21.05.2014    source источник


Ответы (2)


Что ж, я вижу три возможных ответа на ваш вопрос, но не уверен, какой из них вы имеете в виду ...

  • Точечное произведение столбца i из A и строки j из B, которое будет равно умножению матрицы на матрицу B*A:
C = matmul( B,A )
  • Внешний продукт: C=colA * rowB^T, но тогда каждая комбинация i,j приведет к отдельной матрице C.
C = matmul( A(:,i), B(j,:) )
  • Поэлементное умножение, что означает C_ij = A_ij * B_ij. В Фортране это довольно просто:
C = A*B

Выбирайте!

person Alexander Vogt    schedule 21.05.2014

Ваш код не имеет смысла. ColA(i) не является вектором, это скаляр, вы не можете передавать скаляры для умножения матриц. Точно так же C(i,j) не матрица, это скаляр. C - это матрица.

Или, если вы имеете в виду ColA как вектор векторов, это невозможно в Фортране. C тогда должно быть матрицей матриц, что тоже невозможно. Это возможно с производными типами, но вам придется кодировать это самостоятельно.

person Vladimir F    schedule 21.05.2014
comment
Нет, ColA(i) не может быть способом определить вектор-столбец в fortran, но это действительно соответствует моему намерению. Итак, позвольте мне перефразировать, я просто хочу умножить каждый столбец A на каждую строку B. Я думаю, что это матричное умножение законно, и мне было интересно, могу ли я использовать matmul процедуру для этого. Если да, то как? [Если я вам все еще непонятен, дайте мне знать.] - person hbaromega; 21.05.2014
comment
Я все еще вижу точное математическое значение. Какое умножение? Их больше, внутреннее (скалярное, точечное) произведение, перекрестное произведение, внешнее (диадическое, тензорное) произведение, произведение клина или даже произведение Клиффорда ... Или поэлементное умножение. - person Vladimir F; 22.05.2014
comment
Я хотел иметь в виду простое матричное умножение между вектором-строкой и вектором-столбцом, которое может быть внутренним продуктом или внешним продуктом в зависимости от случая. Думаю, @Alexander предоставил достаточно вариантов. Внутренний продукт между строкой и столбцом можно рассматривать как скалярные произведения между двумя столбцами, и можно использовать функцию dot_product в fortran, как он уже упоминал. - person hbaromega; 02.06.2014