我对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
感谢您的帮助。
答案 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';
您应该在问题中显示数据的组织方式。