Search code examples
matlabvectormatrixsimilarity

Nearest column in matlab


I want to find the nearest column of a matrix with a vector.

Consider the matrix is D and the vector is y. I want an acceleration method for this function

function BOOLEAN = IsExsist(D,y)


[~, Ysize, ~] = size(D);
BOOLEAN = 0;
MIN = 1.5;

for i=1:Ysize 
    if(BOOLEAN == 1)
        break;
    end;
    if(norm(y - D(:,i),1) < MIN )
        BOOLEAN = 1;
    end;
end;

end

Solution

  • I am assuming you are looking to "accelerate" this procedure. For the same, try this -

    [~,nearest_column_number] = min(sum(abs(bsxfun(@minus,D,y))))
    

    The above code uses 1-Norm (as used by you) along all the columns of D w.r.t. y. nearest_column_number is your desired output.

    If you are interested in using a threshold MIN for the getting the first nearest column number, you may use the following code -

    normvals = sum(abs(bsxfun(@minus,D,y)))
    nearest_column_number = find(normvals<MIN,1)
    BOOLEAN = ~isempty(nearest_column_number)
    

    nearest_column_number and BOOLEAN are the outputs you might be interested in.

    If you are looking to make a function out of it, just wrap in the above code into the function format you were using, as you already have the desired output from the code.

    Edit 1: If you are using this procedure for a case with large D matrices with sizes like 9x88800, use this -

    normvals = sum(abs(bsxfun(@minus,D,y)));
    BOOLEAN = false;
    for k = 1:numel(normvals)
        if normvals(k) < MIN
            BOOLEAN = true;
            break;
        end
    end
    

    Edit 2: It appears that you are calling this procedure/function a lot of times, which is the bottleneck here. So, my suggestion at this point would be to look into your calling function and see if you could reduce the number of calls, otherwise use your own code or try this slight modified version of it -

    BOOLEAN = false;
    for k = 1:numel(y)
        if norm(y - D(:,k),1) < MIN %// You can try replacing this with "if sum(abs(y - D(:,i),1)) < MIN" to see if it gives any performance improvement
            BOOLEAN = true;
            break;
        end
    end