我有几个矩阵< 1x500>使用不同的整数,现在我检查我感兴趣的值是否存在(在本例中为30,40,50):
if any(val == 30) && any(val == 40) && any(val == 50)
然后我从矩阵中绘制这个图表并且一切正常,除了我想改变它只应该在30,40,50的顺序出现时才给出。现在它只检查它们是否存在于矩阵任何顺序,它可以是40,10,30,无论如何它都会给出真实的。
以下是矩阵的外观输出:0,0,0,0,0,10,50,50,50,50,0,40,40,40,0,0,0,30 ,30,30(这应该是假的) 0,0,0,0,0,30,30,30,40,40,50,50,50,40,0,0,0,30,30,30(这应该是真的)
如果你能为我的爱好项目帮助我,我会很高兴。
答案 0 :(得分:3)
我不确定您为什么选择不使用我在上一个问题中建议的ismember
,但您可以使用 ismember
的两个输出来解决这个。首先,您可以使用第一个输出来确保显示所有值并使用第二个输出(这是每个值的第一个出现的索引),通过将索引值与排序版本进行比较来确定它们是否处于正确的顺序索引值。
b = [0,0,0,0,0,30,30,30,40,40,50,50,50,40,0,0,0,30,30,30];
[bool, location] = ismember([30 40 50], b);
present_and_in_order = all(bool) && issorted(location)
% true
答案 1 :(得分:0)
可能不是最快的方法,但您可以将数据转换为字符串并使用正则表达式:
x = [0,0,0,0,0,30,30,30,40,40,50,50,50,40,0,0,0,30,30,30]; % data
v = [30 40 50]; % values in the desired order
xs = mat2str(x); % string that corresponds to x. Numbers are separated by spaces
pattern = strjoin(cellfun(@num2str, num2cell(v), 'uniformoutput', false), ' (.* )*');
% build pattern for regular expression: numbers from v converted to strings,
% separated by a space and then zero or more characters followed by a space,
% zero or more times
result = ~isempty(regexp(xs, pattern, 'once')); % check if the pattern occurs
请注意,这会为true
或x = [0,30,40,30,50,0];
提供x = [50,30,40,50];
,30
,40
,50
按此顺序排列,可能在两者之间有任意数字。