在数组中查找false值的索引并将其显示在错误中

时间:2017-08-31 13:28:25

标签: matlab error-handling

我有很多逻辑条件需要检查。对于不满足的每个条件,我需要一条错误消息。以下是我更好理解的代码:

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获取值。

2 个答案:

答案 0 :(得分:3)

您不必在自己的行上进行所有这些比较,您可以使用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,您可以将其设为矢量

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;

答案 1 :(得分:0)

尝试查看find功能。你可以阅读它here

简而言之,你可以写:

idx = find(~v)

这将为您提供满足给定条件的项目的索引。 此外,这可用于打印您需要的错误信息。

要显示您可以使用的消息:

disp(['problem with: ', num2str(idx)])

将打印所有感兴趣的指数的正确信息。