Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 从矩阵中减去向量(按行)_Loops_Fortran_Subtraction - Fatal编程技术网

Loops 从矩阵中减去向量(按行)

Loops 从矩阵中减去向量(按行),loops,fortran,subtraction,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 R

假设我有一个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在一行中完成。 关于更好的方法有什么建议吗?

您可以使用以下方法:

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

同样,在
A
的第一个索引上循环也是低效的。 如果你变换矩阵,它可能会大大加快速度。
然后,循环解决方案甚至可能比使用
spread
的更快。(但这取决于编译器。)

谢谢。工作起来很有魅力。谢谢你的效率建议。这确实是那篇文章的翻版。我搜索了论坛,但我们使用了非常不同的英语术语。当你知道答案时,搜索就容易多了。但这是重复系统的一个要点:同一个问题的不同措辞指向一组答案。