forums.silverfrost.com Forum Index forums.silverfrost.com
Welcome to the Silverfrost forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Assign Same Value to Multiple Array Items - How?

 
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> General
View previous topic :: View next topic  
Author Message
viroxa



Joined: 28 Jul 2017
Posts: 78

PostPosted: Wed Aug 09, 2017 10:14 pm    Post subject: Assign Same Value to Multiple Array Items - How? Reply with quote

Good evening, everyone,

I want to achieve something like this in a 2D-array:
Code:
1 0 0 0 0
0 0 1 0 0
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1


What I have now is a nested DO LOOP with an awful amount of IFs and ELSEIFs like:


Code:
DO icoun=1,ncols
    DO jcoun=1,nrows
        IF((icoun==3.AND.jcoun==1) &
           & .OR.(icoun==4.AND.jcoun==2)...) THEN

            ...

        END IF
    END DO
END DO


Is there an easier way to achieve this?
Back to top
View user's profile Send private message
wahorger



Joined: 13 Oct 2014
Posts: 1217
Location: Morrison, CO, USA

PostPosted: Wed Aug 09, 2017 10:56 pm    Post subject: Reply with quote

Use data initialization instead of the "hard coded" setting.

But, this is only really useful if you wish the array to appear the same way, every time. For the example you have given, a simple way to initialize would look like:
Code:

      DATA ((MY_ARRAY(I,J),I=1,5),J=1,5)/ &
     1,0,0,0,0, &
     0,0,1,0,0, &
     0,0,0,1,0, &
     0,1,0,0,0, &
     0,0,0,0,1/
Back to top
View user's profile Send private message Visit poster's website
mecej4



Joined: 31 Oct 2006
Posts: 1885

PostPosted: Wed Aug 09, 2017 10:56 pm    Post subject: Reply with quote

"Something like this" is quite vague, and discourages answering.

If, however, what you intend to have is a permutation matrix, you can store it as a permutation vector (i.e., a 1-D array), with values [1, 4, 2, 3, 5], where the entries are the row numbers of the one (and only one) element with value = 1 in each column, with zeros in the rest of the column.

Such permutation vectors are routinely used in Lapack for routines that do Gaussian elimination with pivoting.

If you want something else, you need to describe that in more detail.


Last edited by mecej4 on Thu Aug 10, 2017 4:20 am; edited 1 time in total
Back to top
View user's profile Send private message
viroxa



Joined: 28 Jul 2017
Posts: 78

PostPosted: Wed Aug 09, 2017 11:39 pm    Post subject: Reply with quote

Thanks for the replies.

mecej4, basically, what I want is exactly like this, the differences being, that it's actually a 14x7 matrix and instead of only "1" it looks like this:

Code:
1 0 0 0 0 0 0
0 2 0 0 0 0 0
2 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 2 0
0 0 0 2 0 0 0
0 0 0 0 0 1 0
0 0 1 0 0 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 1
0 0 0 0 3 0 4
0 0 0 0 5 0 6
0 0 0 0 7 0 8
0 0 0 9 0 0 0
Back to top
View user's profile Send private message
mecej4



Joined: 31 Oct 2006
Posts: 1885

PostPosted: Thu Aug 10, 2017 11:47 am    Post subject: Reply with quote

If what you wish to do is to work with only the non-zero entries in a sparse matrix, you can choose a sparse matrix representation that suits your needs.

The simplest is the so called COO representation. See, for example, http://www.culatools.com/blog/2011/09/08/sparse-101-matrix-formats/ .In this representation, the sparse matrix is stored as an NNZ X 3 matrix, where NNZ is the number of non-zero elements. Each row of the compact matrix contains the (R, C, V) triplet for a non-zero element of the original matrix. R and C are the coordinates (row and column) and V is the value of the matrix element in that position. Except in a few special cases, there are no entries in the COO representation with V = 0.

Viroxa, your phrase "what I want is exactly like this" reminded me of a poster that I saw decades ago, which said:

Quote:
Engineers Do Precision Guesswork


Last edited by mecej4 on Thu Aug 10, 2017 1:13 pm; edited 1 time in total
Back to top
View user's profile Send private message
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2388
Location: Yateley, Hants, UK

PostPosted: Thu Aug 10, 2017 12:02 pm    Post subject: Reply with quote

mecej4's pivot array, and his sparse matrix representation are both great ideas, but if the initialisation is done once per run of the program, the DATA statement (with all the values including zeroes) takes a lot of beating. 14x7 is 98 elements, and as the values are 0, 1 ... etc but never very big, even INTEGER*4 takes up less than 400 bytes, so it is difficult to see that there is a lot of benefit. Traditionally, a lot of such initialisations could be done in a BLOCK DATA subprogram. You could use INTEGER*2.

I've never been very fond of BLOCK DATA, probably because many compilers I've used don't support it rather than it being disapproved of in modern Fortran.

If the array needs to be reinitialised after it has been changed, DATA and BLOCK DATA won't do the job unless you keep a set of arrays in pristine form and simply copy them into your working arrays each time reinitialisation is called for.

Something similar happens with a Multiple Document Interface (MDI) Windows program, because each 'document' (i.e. problem running separately) may need its own initialisations. In such a case, where the program space requirements do not stress the available memory capacity, I find it better to spawn a new complete copy of the program rather than having child windows. That also solves problems of having unique datasets for each 'document'.

Eddie
Back to top
View user's profile Send private message
viroxa



Joined: 28 Jul 2017
Posts: 78

PostPosted: Thu Aug 10, 2017 12:42 pm    Post subject: Reply with quote

Thanks for the suggestions. mecej4's suggestion seems like a good idea.

The array is recalculated 3*nelem times with nelem = number of elements, and thereby assembled into a new [14,7,3]-array. This new array is then again recalculated 3 times with different input values.

All in all there are 3*3*nelem calculations.
Back to top
View user's profile Send private message
mecej4



Joined: 31 Oct 2006
Posts: 1885

PostPosted: Thu Aug 10, 2017 1:19 pm    Post subject: Re: Reply with quote

LitusSaxonicum wrote:
... if the initialisation is done once per run of the program, the DATA statement (with all the values including zeroes) takes a lot of beating

If the program is intended to be applied to more than one problem, fixed arrays initialised with DATA statements are not suitable. Read the problem data from a file, calculate the array sizes based on that data, allocate the arrays, and then read problem data into the arrays (or, if possible, populate the arrays using an algorithm). This is far better than writing an inflexible program to solve only one problem size, and then attempting to adapt the program to each new problem size that comes up.
Back to top
View user's profile Send private message
viroxa



Joined: 28 Jul 2017
Posts: 78

PostPosted: Thu Aug 10, 2017 9:33 pm    Post subject: Reply with quote

Quote:
Read the problem data from a file, calculate the array sizes based on that data, allocate the arrays, and then read problem data into the arrays (or, if possible, populate the arrays using an algorithm)


That's the way I did it.

One more question regarding sparse matrices:
Are there intrinsic routines for sparse matrix operations or could you recommend a library to use?
Back to top
View user's profile Send private message
viroxa



Joined: 28 Jul 2017
Posts: 78

PostPosted: Thu Aug 10, 2017 9:33 pm    Post subject: Reply with quote

Quote:
Read the problem data from a file, calculate the array sizes based on that data, allocate the arrays, and then read problem data into the arrays (or, if possible, populate the arrays using an algorithm)


That's the way I did it.

One more question regarding sparse matrices:
Are there intrinsic routines for sparse matrix operations or could you recommend a library to use?
Back to top
View user's profile Send private message
mecej4



Joined: 31 Oct 2006
Posts: 1885

PostPosted: Thu Aug 10, 2017 9:48 pm    Post subject: Reply with quote

Don't expect intrinsics for sparse matrices for a decade or two. Several libraries are available in source form.

Prof. Yousef Saad is an authority on sparse matrices. See his Web page at http://www-users.cs.umn.edu/~saad/ .

It would be useful for you to be specific about which operations you need to perform with sparse matrices.
Back to top
View user's profile Send private message
viroxa



Joined: 28 Jul 2017
Posts: 78

PostPosted: Fri Aug 11, 2017 7:57 am    Post subject: Reply with quote

- MATMUL
- SUM
-TRANSPOSE
Back to top
View user's profile Send private message
DanRRight



Joined: 10 Mar 2008
Posts: 2813
Location: South Pole, Antarctica

PostPosted: Sat Sep 30, 2017 9:25 am    Post subject: Re: Reply with quote

mecej4 wrote:
Prof. Yousef Saad is an authority on sparse matrices. See his Web page at http://www-users.cs.umn.edu/~saad/ .


Mecej4, have you try his methods in comparison with ones of INTEL and LAIPE we tried earlier this year? Both Intel and LAIPE sparse solvers were slower then dense INTEL solver for the same sparse matrices.
Back to top
View user's profile Send private message
mecej4



Joined: 31 Oct 2006
Posts: 1885

PostPosted: Sat Sep 30, 2017 3:50 pm    Post subject: Reply with quote

Dan, most of the sparse matrix packages are intended for application to matrices other than banded matrices. It can certainly be the case that, for a banded matrix, a specialized band matrix solver will be a better choice than packages such as UMFPack, SuperLU, MUMPS and WSMP. The packages that I listed are of real help with other matrix sparse patterns, such as those that come from piping networks, product manufacturing and distribution, airline reservations, etc.

Laipe2 may well be better for some types of matrices, but I did not like the Fortran 77 tricks that Jenn-Ching Luo uses in his compact matrix representation. Nobody else uses those tricks and they will give you trouble with modern Fortran. For many users, it can be a big hurdle to have to convert from one of the standard compact storage conventions to the Laipe2 scheme.

The only software from Saad's site that I actually used was for converting from one sparse format to another, e.g., RUA to CSR.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> General All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group