логические значения для цензурированных данных - PullRequest
0 голосов
/ 29 ноября 2011

Я относительно новичок в Matlab и у меня есть вопрос о создании логического массива в Matlab. Предположим, у меня есть следующие данные.A содержит фактические значения, а столбец B обозначает U как необнаруженный

AB

2 U

4 U

5

6 U

6

7 U

8

Я хотел бы создать логический массив, такой как необнаруженные значения, получить 1 и еще 0. Таким образом, столбец cбудет выглядеть примерно так:

C = 1 1 0 1 0 1 0

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2011

Если вы используете массив ячеек (мы назовем его data), то я обычно использую cellfun для такого рода работы.

C = cellfun(@(x) ~isempty(x) && ischar(x) && strcmp(x,'U') , data(:,2))

Это определяет анонимную функцию, которая возвращает true для любого ввода, которое (1) не пусто, (2) массив символов и (3) имеет значение «U» и. Он вызывает эту функцию для каждого элемента во втором столбце data и возвращает ее в массиве C.

Мне нравится, что он подходит для одной операции в одной строке. Его легко прочитать после того, как вы используете конструкцию достаточно много раз (но, возможно, не так просто прочитать первые несколько раз).


Более типичным (и, возможно, более простым для понимания) решением является использование цикла.

 C = logical(zeros(size(data,1),1));  %Always preallocate your results vector
 for ix = 1:size(data,1)
     curValue = data{ix,2}l
     C(ix) =  ~isempty(curValue ) && ischar(curValue ) && strcmp(curValue ,'U');
 end

Наконец, похоже, что вы действительно хотите вернуть свой результат в исходный массив ячеек в третьем столбце. Это небольшое изменение в приведенном выше цикле, например:

 for ix = 1:size(data,1)
     curValue = data{ix,2};
     data{ix,3} =  ~isempty(curValue) && ischar(curValue) && strcmp(curValue ,'U');
 end


EDIT

Если ваши данные находятся в массиве ячеек (на основе недавнего комментария), попробуйте:

C = mydata{2} == 'U';

Это извлекает массив символов и сравнивает каждый элемент с символом 'U'.

0 голосов
/ 02 декабря 2011

Исходя из вашего комментария к ответу преследования, все, что вам нужно сделать, это:

C = mydata{2}=='U';

Вы должны показать, как ваши данные организованы в вопросе.

0 голосов
/ 30 ноября 2011

Вы не можете смешивать массивы символов с логическими значениями, но вы можете использовать функцию strcmp.Предположим, у вас есть все это - один массив с именем A (я отмечу, что обнаружен как 'D'):

A = [2,'U';...
     4,'U';...
     5,'D';...
     6,'U';...
     6,'D';...
     7,'U';...
     8,'D']

test = A(:,2);
C = zeros(size(A,1),1);
for i = 1:size(A,1)
    C(i) = strcmp(test(i),'U');
end

Если у вас есть другой способ пометить значения как "обнаруженные", то вы можетевозможность использовать логические, то есть: обнаруженные значения имеют значения выше 5.

C = (A(:,1) > 5);

Вывод будет:

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