如何从最接近或等于K = 0.5的矩阵中选取值?我知道我可以通过取绝对值及其最小值从矩阵中获取值。但是,我希望能够循环遍历矩阵,检查第一个元素是否等于K,如果它相等,则取其索引并中断。但是如果第一个元素不等于K,则循环直到找到等于K的值。继续直到所有等于K的值都用完为止。任何人都能指出我正确的方向吗?提前谢谢。
这是我的代码:
data = rand(10,2);k =0.5;
indr = find(data(:,1));
cNum = data(1,1);
if cNum < k
old_distance = abs(k - cNum);
else
old_distance = abs(cNum - k);
end
Xdata = data(2:end,:);
indeX = find(Xdata(:,1));
for i = 1:size(Xdata,1)
if Xdata(i,1) < k
min_Val = abs(k-Xdata(i,1));
new_distance = min(min_Val);
else
min_Val = abs(Xdata(i,1) -k);
new_distance = min(min_Val);
end
if (new_distance < old_distance)
old_distance = new_distance;
cNum = Xdata(i,1);
end
end
cNum_indeX = indr(indeXm);
Y = cNum;
X = indr(cNum_indeX);'
答案 0 :(得分:4)
要在矢量中找到与特定值最接近的值,您可以执行以下操作:
>> data = rand(10, 1) data = 0.7060 0.0318 0.2769 0.0462 0.0971 0.8235 0.6948 0.3171 0.9502 0.0344 >> k = 0.5; >> [~, index] = min(abs(data - k)); >> closestValue = data(index) closestValue = 0.3171
答案 1 :(得分:1)
for循环很少是MATLAB的答案。假设您要检查数组元素是否在K ± tol
范围内,其中tol
是您设置的容差。您可以通过简单的逻辑索引来实现。
K=0.5;
tol=0.001; %# set your tolerance here
boolIndex=xVector<=K+tol & xVector>=K-tol; %# xVector is your vector
现在boolIndex
只是0
和1
的逻辑索引数组。只要数组元素满足此条件,它就会给出1
。您可以直接使用它来索引矢量以进行进一步操作。如果由于某种原因,您需要确切的索引,则可以通过执行find(boolIndex==1)
来获取它们。
答案 2 :(得分:0)
问题的限制不够明确(我没有足够的观点来评论而不是答案。)
这里的速度是否至关重要?如果是这样,那么你应该避免任何类型的显式循环。使用内置函数通常会更好,除非矩阵非常大并且当你发现足够接近的东西时想要破坏。如果它有数百万个条目,我会把它分成10000左右的块,然后让MATLAB在块上使用min函数。或行。或列。取决于你想做什么。
距离足够近?您使用随机矩阵进行演示,但是您希望舍入误差为0.5?
您是否知道[value,index]=min(x)
会将值和指定为最小值?
我假设矩阵必须很大,否则让MATLAB进行矢量化没有任何缺点:
[colminval,colminind]=min(abs(x-0.5));
[minval,rowminind]=min(colminval);
如果没有更多的方向,这是我能做的最好的方向。