删失数据的逻辑值matlab

时间:2011-11-29 19:47:59

标签: matlab

我对Matlab比较陌生,对于在Matlab中创建逻辑数组有疑问 假设我有以下数据。 A包含实际值,B列表示U未检测到

A B

2 U

4 U

5

6 U

6

7 U

8

我想创建一个逻辑数组,例如未检测到的值得到1和其他0.因此c列看起来像这样:

C = 1 1 0 1 0 1 0

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您不能将char数组与逻辑值混合,但可以使用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]

答案 1 :(得分:0)

如果您的输入是一个单元格数组(我们称之为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

<小时/> 修改

如果您的数据位于数组的单元格数组中(基于最近的评论),请尝试:

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

这将提取字符数组,并将每个元素与字符'U'进行比较。

答案 2 :(得分:0)

根据您对Pursuit答案的评论,您需要做的就是:

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

您应该在问题中显示数据的组织方式。