
forums.silverfrost.com Welcome to the Silverfrost forums

View previous topic :: View next topic 
Author 
Message 
viroxa
Joined: 28 Jul 2017 Posts: 45

Posted: Wed Aug 09, 2017 10:14 pm Post subject: Assign Same Value to Multiple Array Items  How? 


Good evening, everyone,
I want to achieve something like this in a 2Darray:
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 


wahorger
Joined: 13 Oct 2014 Posts: 345 Location: Morrison, CO

Posted: Wed Aug 09, 2017 10:56 pm Post subject: 


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 


mecej4
Joined: 31 Oct 2006 Posts: 674

Posted: Wed Aug 09, 2017 10:56 pm Post subject: 


"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 1D 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 


viroxa
Joined: 28 Jul 2017 Posts: 45

Posted: Wed Aug 09, 2017 11:39 pm Post subject: 


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 


mecej4
Joined: 31 Oct 2006 Posts: 674

Posted: Thu Aug 10, 2017 11:47 am Post subject: 


If what you wish to do is to work with only the nonzero 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/sparse101matrixformats/ .In this representation, the sparse matrix is stored as an NNZ X 3 matrix, where NNZ is the number of nonzero elements. Each row of the compact matrix contains the (R, C, V) triplet for a nonzero 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 


LitusSaxonicum
Joined: 23 Aug 2005 Posts: 1622 Location: Yateley, Hants, UK

Posted: Thu Aug 10, 2017 12:02 pm Post subject: 


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 


viroxa
Joined: 28 Jul 2017 Posts: 45

Posted: Thu Aug 10, 2017 12:42 pm Post subject: 


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 


mecej4
Joined: 31 Oct 2006 Posts: 674

Posted: Thu Aug 10, 2017 1:19 pm Post subject: Re: 


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 


viroxa
Joined: 28 Jul 2017 Posts: 45

Posted: Thu Aug 10, 2017 9:33 pm Post subject: 


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 


viroxa
Joined: 28 Jul 2017 Posts: 45

Posted: Thu Aug 10, 2017 9:33 pm Post subject: 


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 


mecej4
Joined: 31 Oct 2006 Posts: 674

Posted: Thu Aug 10, 2017 9:48 pm Post subject: 


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://wwwusers.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 


viroxa
Joined: 28 Jul 2017 Posts: 45

Posted: Fri Aug 11, 2017 7:57 am Post subject: 


 MATMUL
 SUM
TRANSPOSE 

Back to top 




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
