- Are values in Grid unique?
- Are Grid and Density fixed with just lookup from M varying?
- Is location in Grid significant or simply the nearest value?
Optimizing indirect mapping: From matrix elements to vector values
1 view (last 30 days)
Show older comments
I have a 2-D matrix of values, M. There are also two vectors:
- Grid - holds values which are close to the values in M. The values in Grid are essentially "the same" values in M, just might be slightly different (by 0.001 for example).
- Density - For each value of Grid, there is a corresponding density value.
For each element in the matrix: I need to find its density based on the closest value in Grid.
The following code achieves that, but is slow:
function [ density ] = get_density(x, Density, Grid)
[~, min_diff_idx] = min( abs( x - Grid ) );
density = Density( min_diff_idx );
end
M_new = arrayfun( @(x) get_density(x, Density, Grid), M);
Idea for improvement ?
2 Comments
Accepted Answer
dpb
on 12 Jun 2018
Edited: dpb
on 13 Jun 2018
OK, with the additional information, remove the 2D nature and use interp1
function density = get_density(x, Density, Grid)
persistent D G % save the 1D values for reuse
if ~isfinite(x) & ~isempty(G), clear D G, return, end % reset persistents
if isempty(G) % initialization
[G,ix]=sort(Grid(:)); % interp1 requires ordered independent variable
D=Density(ix); % put associated dependent variable in same sequence
end
density=interp1(G,D,x,'nearest'); % look up nearest based on input
end
Treat the extrapolation as desired; see documentation for further details on interp1
To use, once called initially with all three arguments, only need to call with an x value or array of values.
If want to reset the persistent variables to use a different table; then call with
get_density(inf)
then use the three-argument form with the new table values.
0 Comments
More Answers (0)
See Also
Categories
Find more on Large Files and Big Data in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!