Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的最近列_Matlab_Vector_Matrix_Similarity - Fatal编程技术网

matlab中的最近列

matlab中的最近列,matlab,vector,matrix,similarity,Matlab,Vector,Matrix,Similarity,我想找到一个向量矩阵的最近列 假设矩阵是D,向量是y。我想要这个函数的加速方法 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

我想找到一个向量矩阵的最近列

假设矩阵是D,向量是y。我想要这个函数的加速方法

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
function BOOLEAN=isexist(D,y)
[~,Ysize,~]=尺寸(D);
布尔值=0;
最小值=1.5;
对于i=1:Ysize
如果(布尔==1)
打破
结束;
if(范数(y-D(:,i),1)
我假设您希望“加速”此过程。同样,试试这个-

[~,nearest_column_number] = min(sum(abs(bsxfun(@minus,D,y))))
上述代码沿
D
w.r.t.
y
的所有列使用
1-Norm
(您使用的)<代码>最近的列号是您想要的输出

如果您有兴趣使用阈值
MIN
来获取
第一个最近的列号
,您可以使用以下代码-

normvals = sum(abs(bsxfun(@minus,D,y)))
nearest_column_number = find(normvals<MIN,1)
BOOLEAN = ~isempty(nearest_column_number)
编辑2:您似乎多次调用此过程/函数,这是此处的瓶颈。因此,我在这一点上的建议是查看调用函数,看看是否可以减少调用次数,否则使用自己的代码或尝试稍微修改一下的版本-

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
BOOLEAN=false;
对于k=1:numel(y)
if norm(y-D(:,k),1)
要查找矩阵
D
到列向量
y
的最近列,关于1-范数距离,可以使用:


您目前正在尝试的是优化线性搜索的Matlab实现。 无论您如何优化,它始终需要为每个搜索计算所有
D=88800
距离
D=9
维度。 正如另一个答案中所讨论的那样,这很容易在Matlab中实现,但是如果您计划进行许多这样的搜索,我建议使用不同的数据结构和搜索算法

一个好的canditate应该是(二进制的),它递归地将你的空间沿着你的维度分成两部分。这为创建树增加了相当大的初始开销,并使插入和删除操作的开销稍微增加。但据我了解,您的评论,搜索更加频繁,它们的执行将从
O(D)
down减少到
O(log(D))
,这对于这个问题的规模是一个巨大的改进

我认为应该有一些可用的BSP的Matlab实现,例如在Mathworks文件交换上。
但是如果你找不到,我也很乐意提供一些提示。

这段代码非常专业,但速度很慢,就像我的代码一样,@MehdiKhademloo你的
是谁的
y
信息?d是9*88800,y是9*1@MehdiKhademloo你从我的代码中得到了什么运行时,就为了这个最近的列查找部分?你知道吗?我想为我的字典创建这个D,我认为这个88800列并不重要,而且很多列都是相似的。我想在我的字典创建函数中使用此代码。我的意思是,当我想在字典中添加一列时,使用此函数检查“字典中是否有类似于我的新数据的列?”…您的代码找不到与向量最近的列。检测距离小于给定阈值的第一列。我回答的是文本所说的,而不是代码所说的
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
[~, index] = min(pdist2(y.',D.','minkowski',1));