如何计算最接近或等于0.5的值?

时间:2011-03-13 06:38:58

标签: matlab

如何从最接近或等于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);'

3 个答案:

答案 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只是01的逻辑索引数组。只要数组元素满足此条件,它就会给出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);

如果没有更多的方向,这是我能做的最好的方向。