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