2014-11-03 4 views
2

У меня есть небольшая проблема с некоторыми данными EMG, которые я должен проанализировать для публикации, над которой я работаю.Удаление/манипулирование данными в MATLAB

У меня есть один столбец данных с 13000 точек данных, например,

0 
0 
0 
1.2 
2.5 
3.9 
6.8 
5.3 
2.9 
1.5 
500 
... and so on. 

Теперь проблема у меня есть, что в этом наборе данных, имеются многочисленные точки, такие как 500 выше, которые возникают в данные. Это не ошибочные данные, их просто нет в 1000 раз.

Моя проблема заключается в разрешении этих точек данных. Я могу удалить их с помощью следующего сценария

A = (filename) 
A(A>100)=NaN 

Я, к сожалению, очень новый Matlab, поэтому я надеялся, что кто-то может помочь мне использовать скрипт, который вместо того, чтобы заменить ошибочный номер с NaN, разделив его на 1000, сгенерируйте число в правильных единицах.

Большого спасибо

Дэвид

+2

Почему вы не можете заменить назначение NaN с 'A (A> 100) = A (A> 100) ./ 1000'? – kkuilla

ответ

1

Понимание Логическое Индексация

Что вы делаете с этой командой

A = (filename) 
A(A > 100) = NaN 

называется logical indexing. Вы в основном создаете временный вектор логических (булевых, 0 и 1) размеров numel(A), устанавливая каждый элемент > 100 на 1 и каждый другой элемент на 0. Затем вы используете этот временный логический массив для индексации вектора A. Что происходит, когда вы делаете это A(A > 100), является то, что вы выбираете только элементы в A, соответствующие элементам, установленным на 1 в векторе логических элементов. Для полноты, учитывая

>> A = [0 0 0 1.2 101 3.9 6.8 500]; 
>> indexes = A > 100 
    indexes = [0 0 0 0 1 0 0 1] 
>> A(indexes) % This is equal to your A(A > 100) 
    ans = [101, 500] 

сворачивают ваши ценности

Поняв это, что вы делаете дальше, вы назначаете NaN для выбранных значений: A(A > 100) = NaN. Вместо того чтобы делать это можно масштабировать их любым фактором вам нужно, 1000 в вашем случае:

>> A = [0 0 0 1.2 101 3.9 6.8 500]; 
>> indexes = A > 100 
    indexes = [0 0 0 0 1 0 0 1] 
>> A(indexes) % This is equal to your A(A > 100) 
    ans = [101, 500] 
>> A(indexes) = A(indexes) ./ 1000 
    A = [0 0 0 1.2 0.101 3.9 6.8 0.500] 

Удаление значений

Потому что вы сказали, что вы новичок в Matlab я добавлю, что назначение элементов в NaN делает не удалять их из вашего вектора.То, что вы делаете, вероятно, работает на вас, потому что вы затем рисуете эти данные, а функция Matlab plot() не отображает точки данных со значением NaN.

Правильный способ для удаления данных из вектора присвоить его пустое значение [] так:

>> A = [0 0 0 1.2 101 3.9 6.8 500]; 
>> indexes = A > 100 
    indexes = [0 0 0 0 1 0 0 1] 
>> A(indexes) % This is equal to your A(A > 100) 
    ans = [101, 500] 
>> A(indexes) = [] 
    A = [0 0 0 1.2 3.9 6.8] 
2
A = [0 0 0 1.2 2.5 3.9 6.8 5.3 2.9 1.5 500]; 

Мы находим все индексы, где A>100

(A(A>100)) 

Мы принимаем значение в этих индексах и их разделяют на 1000, поэлементное

A(A>100)./1000 

Затем назначьте их обратно.

A(A>100) = A(A>100)./1000; 

A' 
ans = 

    0.00000 
    0.00000 
    0.00000 
    1.20000 
    2.50000 
    3.90000 
    6.80000 
    5.30000 
    2.90000 
    1.50000 
    0.50000 
+0

Возможно, вам стоит объяснить, почему то, что вы делаете, а не просто отправлять код. Научите человека ловить рыбу. ;) – JoErNanO

+0

Хотя я думаю, что вы могли бы сделать это (много) менее многословно, чем продемонстрировал @JoErNanO, я согласен с тем, что для описания вашего решения полезно добавить не менее 1 или 2 строк. –

+0

@DennisJaheruddin Помните, что OP сказал, что он очень * новый для Matlab. Отсюда (хотя и чрезмерная) многословие. ;) – JoErNanO

Смежные вопросы