当前位置: 首页 > 知识库问答 >
问题:

如何在一个向量中找到与另一个向量最近的值?

和选
2023-03-14

我有两个大小相等的向量,例如。

A=[2.29 2.56 2.77 2.90 2.05] and
B=[2.34 2.62 2.67 2.44 2.52].

我感兴趣的是在两个相同大小的向量A中找到最接近的值(几乎相等)

为了清楚起见,我不想在单个向量中找到最接近的值。上面例子的答案是2.56和2.52。

共有3个答案

卜方伟
2023-03-14

作为一个长篇大论,如果你可以访问统计和机器学习工具箱,那么你可以使用K-最近邻函数,它有一些优点,比如:

>

  • 处理不同长度的数组,例如当size(A)=[M,1]和size(B)=[N,1]

    处理二维数组,例如当大小(A)=[M,d]和大小(B)=[N,d]

    处理不同的距离类型,例如:欧几里得距离、城市街区距离、切比雪夫距离和其他许多距离,甚至你自己也有自定义距离。

    在一些特殊情况下使用KDTree算法,可以获得很好的性能。

    虽然在你的例子中,来自“Luis Mendo”的答案看起来很好,但它不能像工具箱中的K近邻函数那样扩展。

    更新:示例代码

    % A and B could have any Dimension, just same number of columns (signal Dimension)
    A = rand(1000,4);
    B = rand(500,4);
    
    % Use any distance you like, some of them are not supported for KDTreeSearcher,
    % and you should use ExhaustiveSearcher
    myKnnModel= KDTreeSearcher(A, 'Distance', 'minkowski');
    
    % you can ask for many (K) Nearest Neighbors and you always have access to it for later uses
    [Idx, D] = knnsearch(myKnnModel, B, 'K',2);
    
    % and this is answer to your special case
    [~, idxA] = min(D(:, 1))
    idxB = Idx(idxA)
    

  • 谭正谊
    2023-03-14

    作为使用bsxfun的两个向量的起点:

    %// data
    A = [2.29 2.56 2.77 2.90 2.05]
    B = [2.34 2.62 2.67 2.44 2.52]
    
    %// distance matrix 
    dist = abs(bsxfun(@minus,A(:),B(:).'));
    
    %// find row and col indices of minimum
    [~,idx] = min(dist(:))
    [ii,jj] = ind2sub( [numel(A), numel(B)], idx)
    
    %// output 
    a = A(ii)
    b = B(jj)
    

    现在你可以把它放进一个循环等等。

    顺便说一句:

    dist = abs(bsxfun(@minus,A(:),B(:).'));
    

    相当于更明显的:

    dist = pdist2( A(:), B(:) )
    

    但我宁愿选择第一种解决方案,避免开销。

    最后是针对多个向量的完全矢量化方法:

    %// data
    data{1} = [2.29 2.56 2.77 2.90 2.05];
    data{2} = [2.34 2.62 2.67 2.44 2.52];
    data{3} = [2.34 2.62 2.67 2.44 2.52].*2;
    data{4} = [2.34 2.62 2.67 2.44 2.52].*4;
    %// length of each vector
    N = 5;
    
    %// create Filter for distance matrix
    nans(1:numel(data)) = {NaN(N)};
    mask = blkdiag(nans{:}) + 1; 
    
    %// create new input for bsxfun
    X = [data{:}];
    
    %// filtered distance matrix 
    dist = mask.*abs(bsxfun(@minus,X(:),X(:).'));
    
    %// find row and col indices of minimum
    [~,idx] = min(dist(:))
    [ii,jj] = ind2sub( size(dist), idx)
    
    %// output 
    a = X(ii)
    b = X(jj)
    
    崔宇
    2023-03-14

    这适用于可能不同长度的一般数量的向量:

    vectors = {[2.29 2.56 2.77 2.90 2.05] [2.34 2.62 2.67 2.44 2.52] [1 2 3 4]}; 
        % Cell array of data vectors; 3 in this example
    s = cellfun(@numel, vectors); % Get vector lengths
    v = [vectors{:}]; % Concatenate all vectors into a vector
    D = abs(bsxfun(@minus, v, v.')); % Compute distances. This gives a matrix.
        % Distances within the same vector will have to be discarded. This will be
        % done by replacing those values with NaN, in blocks
    bb = arrayfun(@(x) NaN(x), s, 'uniformoutput', false); % Cell array of blocks
    B = blkdiag(bb{:}); % NaN mask with those blocks
    [~, ind] = min(D(:) + B(:)); % Add that mask. Get arg min in linear index
    [ii, jj] = ind2sub(size(D), ind); % Convert to row and column indices
    result = v([ii jj]); % Index into concatenated vector
    
     类似资料:
    • 问题内容: 输入值 :numpy数组; 仅由标量值组成; :numpy数组; 仅由标量值组成; 输出量 :numpy数组; ; 对于in中的每个值,查找in中最接近的值的索引 :numpy数组; ; 对于in中的每个值,查找与in中最接近的值的差 例 示例实现(未完全向量化) 加快此任务的最佳方法是什么?Cython是一个选项,但是,我始终希望能够删除循环并让代码保留为纯NumPy。 更新 我做了

    • 在努力使所有必要的计数变量正确后,我沮丧地发现它不起作用。第一次,是 它被强制为一个整数,因此变成。 在第二个循环重复中,只包含红色,变成一个简单的整数向量,。 我做错了什么?是否有一种方法可以初始化,这样它就不会被转换成一个数字向量,而是变成一个向量列表? 还有,除了“滚我自己的”,还有别的办法做整件事吗?

    • 我有一个人名向量列表,每个向量只有名字和姓氏,我有另一个向量列表,每个向量有名字的第一个,中间的,姓氏。我需要匹配这两个列表,以找到包含在这两个列表中的人。因为名称不是按顺序排列的(有些向量以名字作为第一个值,而有些向量以姓氏作为第一个值),所以我想通过查找第二个列表中的哪个向量(全名)包含第一个列表中某个向量的所有值(只有名字和姓氏)来匹配这两个向量。 到目前为止我所做的: 首先,我尝试创建一个

    • 问题内容: 我有一个具有维度(不包括索引)的DataFrame(df1),我想要为该行将每个行除以另一个具有维度的DataFrame(df2)。两者具有相同的列标题。我试过了: 以及 其他多个解决方案,我总是在每个单元格中获得包含值的df 。我在函数中缺少什么参数? 问题答案: 在中,您需要提供df2(例如)的轴/行。 或者你可以使用

    • 问题内容: 我有一个登录名和一个注册页面。当随机用户想要登录并且登录成功时,我想将他重定向到另一个.ejs页面(例如UserHomePage.ejs),但是到目前为止,我没有尝试过。 我也想知道,如何在单击按钮时重定向用户。 假设我在显示用户页面上,在这里显示所有用户,然后有“添加另一个使用过的按钮”。我怎么做?在onclick之后如何将用户重定向到Register.js页面? 问题答案: 您应该