2016-05-11 6 views
1

Предположим, у меня есть матрица A в Fortran, который (п, м), и вектор B, который представляет собой (1, м). Я хочу вычесть вектор B из всех строк A без использования цикла.Вычесть вектор из матрицы (строчном)

В настоящее время я только был в состоянии сделать это с помощью цикла:

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

Смежные вопросы