1

The Situation is as follows:

I have to arrays, symbolizing a positive domain x, and another array whose a function of that domain z

Now, I want, for a given point y, to find the z value in the nearest location. For thatI wrote the following function:

R0 = @(y) z(find(abs( abs(y). -  r) == min(abs(abs(y). - r))))

(The use of abs is for negative values of y, since z is symmetric)

This works perfectally well, unless y is a vector. So, if I use the following code:

y = [-1:0.01:1];
R0(y);

I get the following error:

Error using  == 
Matrix dimensions must agree.

Trying to debug it, I came to see that the find statement returned a 1*0 matrix, hence nothing. This is although the value of y ACTUALLY EXSIST in the r array.

What I really want is to get a new vector, which assign the nearest value in z for each value of y.

Other, totally different solutions might be used, so I prefer understanding why this solution doesn't work and how can I make it work.

Thanks

Amir Sagiv
  • 376
  • 5
  • 23

2 Answers2

3

Your question is not very clear. If I understand correctly, for each element of y you want to find the closest element in z.

y = [1 2 3 4 5]; %// example data
z = [0 2.5 6]; %// example data
d = abs(bsxfun(@minus, y(:).', z(:))); %'// compute distance for all pairs
[~, ind] = min(d); %// index of minimizer in z for each value of y
result = z(ind);

In this example,

result =
        0    2.5000    2.5000    2.5000    6.0000
Luis Mendo
  • 110,752
  • 13
  • 76
  • 147
  • 1
    Thnx, helped me alot. what is the `[~,ind]` syntax you're using? – Amir Sagiv Jun 07 '14 at 18:23
  • 1
    @user42864: `min` returns two parameters. The first parameter returns the minimum of the array and the second parameter returns the **location** of where this minimum occurs. The `~` simply trashes the first parameter - It's not storing it into a variable as we don't need it. For the second parameter, Luis Mendo is taking this index of where the minimum occurs to access the `z` array. – rayryeng Jun 08 '14 at 01:56
1

I am assuming that all of r,z,y are row vectors;

According to the code you provided, it looks like you need the value in z whose index is same as the index of the value in r closest to scalar y. The following code does the same for a row vector y.

function output = some_fun(r,z,y)
    %// column i of temp is abs(r - y(i))
    temp = abs(repmat(abs(y),size(r,2),1) - repmat(r',1,size(y,2))) % // it is a size(r,2) x size(y,2) matrix
    %// each column i of min_ has min(abs(r - y(i))) as all its entries
    min_ = repmat(min(temp),size(r,2),1);  % // it is a size(r,2) x size(y,2) matrix
    %// each column i of ind1 has value of 1 corresponding to the index of closest element of r to y(i) and zero for others
    ind1 = temp == min;
    %// row_(i) is the row index of ind1 where the value is 1 for column i in ind1.
    [row_ col_] = find(ind1);
    %// thus row_(i) is the index of element of r closest to y(i)
    output = z(1,row_);
end
Nishant
  • 2,571
  • 1
  • 17
  • 29