Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
27431 Discussions

How to accessing a 2D array with indexing array


Please help.

  integer*4 idx(n),ind(m),k,p,q
  real*8  data(p,q),ipt(m),dp(p,q)

  DO k=1,m
      dp(idx(ind),k) = 2*ipt*data(idx(ind),k);


My FORTRAN mex program has similar code as listed above. I need to recursively calculate specific elements of dp, column by column. The row indexes are given by the indexing arrays idx and ind. The results show that some of the elements are not properly set. I checked the program by setting break points in VS2013. It seems a indexing problem. My other version in which dp is 1D works very well. I also tried the following variations


   dp([idx(ind)],k) = 2*ipt*data([idx(ind)],k); 

Still without success.  And the output seems somehow to be related to the optimization options /O2 or /O3.

I'm not familiar with Fortran. Only use it to write MEX to relieve the time-consuming part in MATLAB. My question is when using indexing arrays to access specific elements of a 2D array, what's the meaning of the []? How can I properly code to realize the purpose.


0 Kudos
1 Reply

Hi Qun,

It's a little hard to follow, but from my understanding you previously had declared dp(p), and had the k loop in matlab? And this worked? 

My suggestion is to go back to basics, and rather than access as an array write as an explicit loop:

integer*4 idx(n),ind(m),k,p,q

real*8  data(p,q),ipt(m),dp(p,q)

! New loop variable
integer*4 i

DO k=1,q

    ! dp(idx(ind),k) = 2*ipt*data(idx(ind),k);

    ! Replace with loop...
    DO i = 1, m
          dp(idx(ind(i)),k) = 2 * ipt(i) * data(idx(ind(i)),k)
    END DO


Sorry if there's a mistake!

I also think that your k loop should be going from 1 to q as the second dimension is sized q, not m - maybe this is the source of your trouble? 

FYI in Fortran [ ] or (/    /) are used to create an array - I don't think you need this for the example. 

If this doesn't help try coding what you want in Matlab so it works, and post that here so that I, or others, can help.

Good luck,