从矩阵中减去一个向量(逐行)

时间:2016-05-11 19:39:10

标签: loops fortran subtraction

假设我在fortran中有一个矩阵 A ,它是(n,m),而一个向量 B 是(1,m)。我想在不使用循环的情况下从A的所有行中减去向量B.

截至目前,我只能通过循环来实现:

PROGRAM Subtract
IMPLICIT NONE

REAL, DIMENSION(250,5) :: A
INTEGER, DIMENSION(1,5) :: B
INTEGER :: i

B(1,1) = 1
B(1,2) = 2
B(1,3) = 3
B(1,4) = 4
B(1,5) = 5

CALL RANDOM_NUMBER(A)

do i=1,250
    A(i,:) = A(i,:) - B(1,:)
end do


end program

但这是非常低效的。例如。在matlab中,可以使用函数reptmat在一行中完成它。 有关更好的方法的任何建议?

1 个答案:

答案 0 :(得分:1)

您可以使用spread

A = A - spread( B(1,:), 1, 250 )

请注意,Fortran是列专用的,因此B(1,:)通常在内存中不连续,并且会创建一个临时数组。 [这是你的情况,因为你只有一列 - 但仍然值得一提。 ]

以同样的方式,循环A的第一个索引是低效的。 如果你转换你的矩阵,它可能会加速很多事情。 然后,循环解决方案甚至可能比使用spread的解决方案更快。 (但这取决于编译器。)