我有很多逻辑条件要检查。对于每个不满足的条件,我需要一条错误消息。这是我的代码,可以更好地理解:
v1 = isequal(c{1, 1}, 'some string');
v2 = isequal(c{1, 2}, 0);
v3 = isequal(c{2, 1}, 'some string');
v4 = isequal(c{2, 2}, 0);
v5 = isequal(c{3, 1}, 'some string');
v6 = isequal(c{3, 2}, 0);
v = [v1, v2, v3, v4, v5, v6];
在上面的代码中,一些测试返回false,因此在
v
中它们为零(false)。现在,我要获取哪些为零并在错误中对其进行标记。例如,如果v3为false,则需要显示
error('Check the v3 for solving')
的输出。如果条件超过一次,我将无法使用,我还需要从
v
获取值。
最佳答案
您不必自己进行所有这些比较,可以使用cellfun
c = {'test', 0
'some string', 1
'some string', 0};
V = cellfun(@isequal, c, {'some string', 0; 'some string', 0; 'some string', 0})
>> V = 3x2 logical
[0 1
1 0
1 1]
要获取
v
,您可以将其转换为 vector v = V(:); % v = [0 1 1 1 0 1].';
然后,您可以创建错误消息。
error(['Check: ' sprintf('v%d, ', find(~v)) 'did not match criteria'])
% Output in red (and stops function) as it is an error
>> Check: v1, v5, did not match criteria
当然,您可以像以前一样继续创建
v
,或者跳过声明v = V(:)
并直接在错误的V(:)
语句中使用v
代替find
。无论哪种方式,这基本上都是使用
sprintf
创建所需错误的一种方法。如果您的两个检查确实始终是两个相同的值(例如
'some string'
和0
),则不必每次都将它们写出来V = cellfun(@isequal, c, repmat({'some string', 0}, size(c,1), 1))
您可能要在启动错误之前检查是否至少有一个
false
值,请使用any
...if any(~v); error(['Check: ' sprintf('v%d, ', find(~v)) 'did not match criteria']); end;
关于matlab - 在数组中找到错误值的索引并显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45982665/