我有一个包含许多重复值的单元格数组列表,其中包括字符串,采样时间,饱和度上限和下限。
例如:
MyValues={ 'Lookc_at_the_stars'
'Lookc_how_they_shine'
'forc_you'
'andm_everything_they_do'
'Theym_were_all_yellow'
'COLDPLAY_STOP'
'COLDPLAY_PLAY'
'COLDPLAY_PLAY'
'COLDPLAY_PLAY'
'COLDPLAY_BREAK'
'COLDPLAY_BREAK'
'Lookc_How_they_shinefor_you'
'its_true'
'COLDPLAY_STOP'
'COLDPLAY_STOP' }
我需要的输出是:
NewMyValues = { 'Lookc_at_the_stars'
'Lookc_how_they_shine'
'forc_you'
'andm_everything_they_do'
'Theym_were_all_yellow'
'COLDPLAY_STOP'
'COLDPLAY_PLAY'
'COLDPLAY_BREAK'
'Lookc_How_they_shinefor_you'
'its_true' }
由于我尝试使用函数unique
,我无法得到输出,因为它给我一个错误,说
“使用cell / unique时出错 输入A必须是字符串的单元格数组。“
MyValues
由不同类型的数据类型值组成。
有人可以提供解决方案或功能代码,我可以删除重复的值吗?
答案 0 :(得分:0)
这是一个基于循环的解决方案,用于提取不同类型的单元格数组的唯一值:
MyValues={ 'Lookc_at_the_stars',
'Lookc_how_they_shine',
1,
'forc_you',
'andm_everything_they_do',
'Theym_were_all_yellow',
2,
'COLDPLAY_STOP',
'COLDPLAY_PLAY',
1,
'COLDPLAY_PLAY',
'COLDPLAY_PLAY',
{1 2 3},
'COLDPLAY_BREAK',
{4 3 5},
'COLDPLAY_BREAK',
{1 2 3},
'Lookc_How_they_shinefor_you',
'its_true',
'COLDPLAY_STOP',
'COLDPLAY_STOP' };
N = numel(MyValues);
idx = true(N,1);
for m = 1: N
if idx(m)
for n = (m+1):N
if idx(n) && isequal(MyValues{m}, MyValues{n})
idx(n) = false;
end
end
end
end
result = MyValues(idx);
结果:
result =
{
[1,1] = Lookc_at_the_stars
[1,2] = Lookc_how_they_shine
[1,3] = 1
[1,4] = forc_you
[1,5] = andm_everything_they_do
[1,6] = Theym_were_all_yellow
[1,7] = 2
[1,8] = COLDPLAY_STOP
[1,9] = COLDPLAY_PLAY
[1,10] =
{
[1,1] = 1
[1,2] = 2
[1,3] = 3
}
[1,11] = COLDPLAY_BREAK
[1,12] =
{
[1,1] = 4
[1,2] = 3
[1,3] = 5
}
[1,13] = Lookc_How_they_shinefor_you
[1,14] = its_true
}
函数isequal
可以比较使用它的所有值,比较所有值并删除重复项。所以result
是一个包含唯一值的单元格数组
根据问题中的示例,如果要使用唯一的单元格数组,可以使用cellfun
和ischar
来检查单元格值是否为字符数组。然后使用逻辑索引提取它们并应用unique
。
unique(MyValues(cellfun(@ischar,MyValues)),'stable')
不使用stable
选项,结果将被排序
答案 1 :(得分:0)
您在问题中提供的单元格仅包含字符串,因此unique
可以处理它。但是,如果向其添加整数,浮点数或复数,则可以在调用唯一之前将所有单元格元素转换为字符串。例如,我会向您展示一个小strcaster
函数
function y = strcaster(x)
if ischar(x)
y = x;
elseif isreal(x)
y = num2str(x);
else
if imag(x)>=0
s = '+j';
else
s = '-j';
end
y = [num2str(real(x)),s,num2str(imag(x))];
end
end
然后你可以获得独特的元素,保留它们在单元格中出现的顺序,执行以下操作:
MyValues={'Lookc_at_the_stars',...
'Lookc_how_they_shine',...
'forc_you',...
'andm_everything_they_do',...
'Theym_were_all_yellow',...
'COLDPLAY_STOP',...
'COLDPLAY_PLAY',...
'COLDPLAY_PLAY',...
'COLDPLAY_PLAY',...
'COLDPLAY_BREAK',...
'COLDPLAY_BREAK',...
'Lookc_How_they_shinefor_you',...
'its_true',...
'COLDPLAY_STOP',...
'COLDPLAY_STOP',...
1,...
1.32423,...
complex(-3.,13)};
[u,i] = unique(cellfun(@(x)strcaster(x),MyValues,'uniformoutput',false),'stable');
disp(MyValues(i))
修改
根据您的评论,很明显MyValues
单元格包含其他单元格,您的问题的示例中并未明确这一点。获取MyValues
中唯一值的最佳方法仍然是将内容转换为字符串。 JSON协议允许您将几乎任何数据类型转换为字符串,因此我建议以下列方式使用matlab的jsonencode函数:
MyValues={'Lookc_at_the_stars',...
'Lookc_how_they_shine',...
'forc_you',...
'andm_everything_they_do',...
'Theym_were_all_yellow',...
'COLDPLAY_STOP',...
'COLDPLAY_PLAY',...
'COLDPLAY_PLAY',...
'COLDPLAY_PLAY',...
'COLDPLAY_BREAK',...
'COLDPLAY_BREAK',...
'Lookc_How_they_shinefor_you',...
'its_true',...
'COLDPLAY_STOP',...
'COLDPLAY_STOP',...
1,...
1.32423,...
[1,23,4,4;5,3,2,1],...
{'bla',1324,{'12',123}},...
struct('NextTime','Provide a complete working example in the question')};
[u,i] = unique(cellfun(@(x)jsonencode(x),MyValues,'uniformoutput',false),'stable');
disp(MyValues(i))