Arrays Fortran:从矩阵中提取列和行,并将它们用作乘法的一维数组

Arrays Fortran:从矩阵中提取列和行,并将它们用作乘法的一维数组,arrays,matrix,fortran,fortran90,Arrays,Matrix,Fortran,Fortran90,假设矩阵A和B的大小都是nxn。现在我想把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 你的代码没有意义ColA(i)不是向量,它是标量,不

假设矩阵
A
B
的大小都是nxn。现在我想把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

你的代码没有意义
ColA(i)
不是向量,它是标量,不能将标量传递给矩阵乘法。同样地,
C(i,j)
不是矩阵,而是标量<代码>C是一个矩阵


或者,如果你的意思是
ColA
是向量的向量,那在Fortran中是不可能的
C
必须是矩阵的矩阵,这也是不可能的。可以使用派生类型,但您必须自己编写代码

您的代码没有意义
ColA(i)
不是向量,它是标量,不能将标量传递给矩阵乘法。同样地,
C(i,j)
不是矩阵,而是标量<代码>C是一个矩阵


或者,如果你的意思是
ColA
是向量的向量,那在Fortran中是不可能的
C
必须是矩阵的矩阵,这也是不可能的。可以使用派生类型,但您必须自己编写代码

好吧,对于你的问题,我可以看到三个可能的答案,但我不确定你指的是哪一个

  • A
    i
    列和
    B
    j
    行的点积等于矩阵乘法
    B*A
  • 外部产品:
    C=colA*rowB^T
    ,但是每个组合
    i,j
    将产生一个单独的矩阵
    C
  • 元素相乘,这意味着
    C_ij=A_ij*B_ij
    。这在Fortran中非常简单:

你挑吧

好吧,对于你的问题,我可以看到三个可能的答案,但我不确定你指的是哪一个

  • A
    i
    列和
    B
    j
    行的点积等于矩阵乘法
    B*A
  • 外部产品:
    C=colA*rowB^T
    ,但是每个组合
    i,j
    将产生一个单独的矩阵
    C
  • 元素相乘,这意味着
    C_ij=A_ij*B_ij
    。这在Fortran中非常简单:

你挑吧

不,
ColA(i)
可能不是用fortran定义列向量的方法,但它确实符合我的意图。让我换一种说法,我只想把
A
的每一列乘以
B
的每一行。我认为这个矩阵乘法是合法的,我想知道我是否可以使用
matmul
例程。如果是,如何进行?[如果你觉得我仍然不清楚,请告诉我。]我仍然明白确切的数学含义。什么乘法?有更多的,内积(标量,点积),叉积,外积(并矢,张量),楔积,甚至Clifford积。。。或者元素相乘,我想说的是行向量和列向量之间的简单矩阵相乘,可以是内积,也可以是外积。我想,@Alexander提供了足够的选择。行和列之间的内积可以被认为是两列之间的点积,人们可以使用fortran中的点积函数,正如他已经提到的那样。不,
ColA(i)
可能不是在fortran中定义列向量的方法,但它确实符合我的意图。让我换一种说法,我只想把
A
的每一列乘以
B
的每一行。我认为这个矩阵乘法是合法的,我想知道我是否可以使用
matmul
例程。如果是,如何进行?[如果你觉得我仍然不清楚,请告诉我。]我仍然明白确切的数学含义。什么乘法?有更多的,内积(标量,点积),叉积,外积(并矢,张量),楔积,甚至Clifford积。。。或者元素相乘,我想说的是行向量和列向量之间的简单矩阵相乘,可以是内积,也可以是外积。我想,@Alexander提供了足够的选择。行和列之间的内积可以被认为是两列之间的点积,人们可以使用fortran中的点积函数,正如他已经提到的那样。
C = matmul( B,A )
C = matmul( A(:,i), B(j,:) )
C = A*B