Как вычислить значения, наиболее близкие или равные 0,5? - PullRequest
1 голос
/ 13 марта 2011

как выбрать значения из матрицы, ближайшей или равной 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 ]

4 голосов
/ 13 марта 2011

Чтобы найти наиболее близкое значение в векторе к определенному значению, вы можете сделать это:

>> 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 голос
/ 13 марта 2011

Для циклов редко встречаются ответы в 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).

0 голосов
/ 13 марта 2011

Недостатки проблемы недостаточно ясны (и у меня недостаточно очков, чтобы сделать это комментарием, а не ответом).

  • Здесь критична скорость?Если это так, то вам следует избегать какого-либо явного цикла.Обычно лучше использовать встроенные функции, если матрица не очень большая и вы не хотите ломаться, когда находите что-то достаточно близкое.Если в нем миллионы записей, я бы разбил его на куски по 10000 или около того и позволил бы MATLAB использовать функцию min для кусков.Или строки.Или столбцы.Зависит от того, что вы хотите сделать.

  • Насколько близко достаточно близко?Вы демонстрируете со случайной матрицей, но ожидаете ли вы чего-то в пределах ошибки округления 0,5?

  • Знаете ли вы, что [value,index]=min(x) даст значения и index ofминимум?

Я предполагаю, что матрица должна быть большой, иначе не было бы недостатка в том, чтобы позволить MATLAB выполнять векторизацию:

[colminval,colminind]=min(abs(x-0.5));
[minval,rowminind]=min(colminval);

Это лучшее, что я могу сделатьдля направления без более ... направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...