我有很多逻辑条件需要检查。对于不满足的每个条件,我需要一条错误消息。以下是我更好理解的代码:
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
获取值。
答案 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)])
将打印所有感兴趣的指数的正确信息。