2013-05-16 39 views

Trả lời

2

Vâng, xem câu trả lời High Performance của Mark về làm thế nào để làm điều này với với PACK chức năng instrinsic.

Nếu tôi cần thiết để thực hiện các hoạt động trên tất cả các phần tử mảng đáp ứng một số điều kiện, tôi sẽ thực hiện nó sử dụng một sự kết hợp của DOIF cấu trúc, ví dụ:

INTEGER :: i 
REAL,DIMENSION(10) :: a 
REAL :: eps = someSmallNumber 
... 
DO i = 1,SIZE(a) 
    IF(0 > a(i)-eps .AND. 0 < a(i)+eps)THEN 
    ... 
    ENDIF 
ENDDO 

Phạm vi (a(i)-eps,a(i)+eps) được sử dụng ở trên để ngăn chặn so sánh thất bại do số học dấu phẩy động. Nếu làm việc với số nguyên, một so sánh chính xác == sẽ thực hiện.

Nếu chỉ hoạt động gán cho phần tử mảng là cần thiết, bạn có thể đạt được điều này bằng cách sử dụng các cấu trúc WHERE hoặc FORALL.

+0

Nó rất hữu ích và rõ ràng! – marco

+0

thường, thử nghiệm được viết: if (abs (a (i))

7

Cho một mảng số nguyên như:

testarr = [0,1,0,2,0,3,0,4] 

thì biểu thức

pack([(ix,ix=1,size(testarr))],testarr==0) 

sẽ trở lại với chỉ số của các yếu tố trong testarr bằng 0.

Tôi sẽ để bạn khái quát hoặc nâng cao điều này để đối phó với các số thực hoặc bọc nó vào một chức năng phù hợp với mục đích của bạn.

Tiêu chuẩn Fortran 2008 thêm chức năng nội tại mới findloc cung cấp thay thế cho số find của Matlab mà câu hỏi tìm kiếm; trình biên dịch tôi sử dụng nhiều nhất (Intel Fortran 13.1.1) dường như chưa thực hiện điều này.

+0

+1 Đây là câu trả lời đúng. – milancurcic

0

Giải pháp Đánh dấu hiệu suất cao dựa trên số pack nội tại ngắn và thanh lịch. Tuy nhiên, nếu mảng của bạn là tương đối nhỏ, tìm kiếm một giá trị cụ thể với pack có xu hướng chậm hơn so với một tìm kiếm brute force dựa trên một vòng lặp do:

do i = 1, size(testarr) 

    if (testarr(i) == 0) then 

    idx = i 
    exit 

    end if 

end do 

Xem Craig Finch's answer để biết chi tiết. Tôi cũng đã xác minh rằng sức mạnh vũ phu do vòng lặp nhanh hơn đối với các mảng nhỏ (< 10 phần tử), so với tìm kiếm dựa trên pack.

+1

lưu ý điều này chỉ tìm thấy trường hợp đầu tiên. – agentp

+0

Điều đó sẽ giải thích cho tốc độ lớn hơn của nó! –

Các vấn đề liên quan