2016-05-11 95 views
1

假設我有一個在(n,m)的fortran中的矩陣A和(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在一行中完成。 任何建議更好的方式來做到這一點?

+0

這確實是該帖子的副本。我搜索了論壇,但我們使用了非常不同的英語術語。 – phdstudent

+1

當你知道答案時,搜索更容易。但這是重複系統的一個重點:表達同一個問題的不同方式指向一組答案。 – francescalus

回答

1

您可以使用spread此:

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

請注意,Fortran語言是列爲主,所以B(1,:)是一般在內存中不連續,並創建一個臨時數組。 [這是你的情況,因爲你只有一列 - 但仍值得一提。 ]

以同樣的方式,循環第一個索引A效率不高。 如果你換了矩陣,它可能會加快速度。 然後,循環解決方案甚至可能比使用spread的循環解決方案更快。 (但這取決於編譯器。)

+0

謝謝。像魅力一樣工作。並感謝您的有效性建議。 – phdstudent