1

I have a map (512x512) that has values is between 0.119 and 0.2499 and I want to use it as a probability map so I need to expand this distance to [0,1]. How can I do it and map the first map's value into [0,1]?

SecretAgentMan
  • 2,856
  • 7
  • 21
  • 41
david
  • 1,255
  • 4
  • 13
  • 26
  • 1
    Can you show the code you have so far and what you have tried? Can you also include an [mre] – shayaan Jan 17 '20 at 08:05
  • Thank you. I think I find the answer. I use mapminmax function and map my values into a new range. – david Jan 17 '20 at 08:08

2 Answers2

4

Manually scaling: No Toolbox Required
Following a number of posts with this (1, 2, 3, 4),

If your numbers x currently lie on the interval [xmin xmax], the code below completes the following steps[a] to map to [a b]:
1. x - xmin maps x to interval [0 xmax-xmin],
2. (x-xmin)./(xmax-xmin) maps x to the interval [0 1]; note that x = xmin are now 0 and x = xmax are now 1,[b]
3. Multiplying (x-xmin)./(xmax-xmin) with (b-a) now maps x to the interval [0 b-a] (note element-wise multiplication .*),
4. Adding a to ((x-xmin)./(xmax-xmin)).*(b-a) shifts that interval to [a b].

Note this requires xmax > xmin to avoid division by zero. Also requires b > a to avoid mapping everything to a.

xmin = 0.119;               % current lowerbound for data
xmax = 0.2499;              % current upperbound for data    (xmax > xmin)
a = 0;                      % target lowerbound (under new scale)
b = 1;                      % target upperbound

A = xmin*ones(512) + (xmax-xmin)*rand(512);          % generate example current data

fh=@(x) ((x-xmin)./(xmax-xmin)).*(b-a)+a;            % rescaling function

A2 = fh(A);                                        

You can compare min(A(:)) and max(A(:)) with min(A2(:)) and max(A2(:)), respectively.

Using mapminmax(): Deep Learning Toolbox Required
A close look at the documentation for mapminmax() (see "Algorithms") shows the above process is exactly what this function is doing. Just replace [ymin ymax] below with [a b] and compare to the above "manually scaling" approach provided. Note mapminmax() has an additional assumption (copied below).

It is assumed that X has only finite real values, and that the elements of each row are not all equal. (If xmax=xmin or if either xmax or xmin are non-finite, then y=x and no change occurs.)

y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;

So the appropriate use would look like

A3 = mapminmax(A,a,b);

[a] Credit to @S.Kolassa - Reinstate Monica for this excellent answer.
[b] Since you desire [0 1], this is all you need. I've given the more general case for those seeking interval [a b] with b > a.

SecretAgentMan
  • 2,856
  • 7
  • 21
  • 41
0

I want to map my values in a matrix to a new range and I used mapminmax function for this aim and it works for me. if you have other suggestions please let me know. Thank you.

david
  • 1,255
  • 4
  • 13
  • 26
  • You're right! The [`mapminmax()`](https://www.mathworks.com/help/deeplearning/ref/mapminmax.html) does this. See my answer for detailed explanation. – SecretAgentMan Jan 17 '20 at 15:05