# [GRASSLIST:416] Re: a huge matrix ?

orkun temiz at deprem.gov.tr
Wed Jun 18 01:39:29 EDT 2003

```Glynn Clements wrote:

>orkun wrote:
>
>
>
>>>>I have a huge matrix containing 7 column and 10500 rows.
>>>>Each columns stand for different maps. Each rows represent "unique"
>>>>combinations of catagories of maps and probability values
>>>>of each row.
>>>>Something like:
>>>>
>>>>             map1  map2 map3 ... prob
>>>>1   cat1       x     x    x        x
>>>>2   cat2       x     x    x        x
>>>>.     .
>>>>.     .
>>>>10500 .
>>>>
>>>>So I have 10500 if-clause to create a probability map.
>>>>I tried r.mapcalc (as from a text file) but grass gave "stack overflow"
>>>>error.
>>>>
>>>>
>>>>
>>>>
>>>I'm not surprised.
>>>
>>>
>>>
>>>
>>>
>>>>Is there anyone making suggestions ?
>>>>
>>>>
>>>>
>>>>
>>>You need to describe your problem in more detail; it isn't clear what
>>>you are trying to calculate.
>>>
>>>
>>>
>>>
>>>
>>
>>You wanted to know the problem in more detail:
>>
>>what I did:
>>1- using r.stat command I produced a text file for statistical calculations
>>2- using R statistical package I produced probability results of each
>>map's for each categories.
>>it means 7 columns of maps 10500 rows plus probability of each
>>combination.   Actually it is a contingency table. Any data in table
>>(matrix) is resulting  from unique combination of maps and their
>>categories.
>>3- I want to port these results to grass to create a  map (of landslide
>>susceptibility map) . Firstly I thought I used r.mapcalc with piping
>>from text file. But because text file contains a huge matrix that is
>>made up of 10500 if statement (for same  number of  rows) process failed.
>>I attached a part of text file after modifying for r.mapcalc. you  see
>>all ifs are unique.
>>
>>
>
>OK, so: each line is a rule; for each pixel you scan the list of rules
>to find the first match, then output the associated result. Right?
>
>The most straightforward approach (although not particularly
>efficient), would be to use an iterative approach, i.e.
>
>	n=0
>	last='null()'
>	while read a1 a2 a3 a4 a5 a6 a7 a8 ; do
>		result=pr2.pass\$n
>		r.mapcalc "\$result = if (f28geo5==\$a1 && f28slpcat==\$a2 && f28concavity==\$a3 && n_facing==\$a4 && road_bas==\$a5 &&str_buf==\$a6 && f28f4==\$a7, \$a8, \$last)"
>		last=\$result
>	done < rules.txt
>
>where rules.txt looks like:
>
>	21 6 1 1 1 1 0 701.22
>	 7 4 2 1 1 2 1 702.06
>	...
>
>Alternatively, you could combine this with your initial approach, only
>matching a limited number of rules on each pass, and using several
>passes.
>
>However, I note that there seem to be very few possible values for
>most of the maps. In that case, a far more efficient approach would be
>to:
>
>1. Reclass each input map so that all of the significant categories
>are consecutively numbered from zero (0,1,2,3,...); any insignificant
>categories would be merged into the last category.
>
>2. Compute a composite map, using e.g.
>
>	composite = f28geo5 + 22 * (f28slpcat + 9 * (f28concavity + 3 * ...
>
>where the numbers are the total number of categories in the preceding
>map.
>
>3. Assign the values as labels for the composite categories.
>
>4. Use "@map" in r.mapcalc to use the label instead of the category.
>
>
>

Firstly I intend to try your iterative way.
In that,  doesn't n have any increament ?
something like n=n+1 in the loop.
If so,Doesn't  it mean creating a new map - totally 10500 map-  in every
iteration

regards

______________________________________
Scanned and protected by Inflex
http://pldaniels.com/inflex

______________________________________
The views and opinions expressed in this e-mail message are the sender's own
and do not necessarily represent the views and the opinions of Earthquake Research Dept.
of General Directorate of Disaster Affairs.

Bu e-postadaki fikir ve gorusler gonderenin sahsina ait olup, yasal olarak T.C.
B.I.B. Afet Isleri Gn.Mud. Deprem Arastirma Dairesi'ni baglayici nitelikte degildir.

```