2017-08-31 53 views
1

我有一堆要检查的逻辑条件。对于不满足的每个条件,我需要一个错误消息。这是我更好地理解代码:在数组中查找假值的索引并将它们显示为错误

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零(假)。

现在我想得到哪些是零并将它们标记为错误。例如,如果v3为false,则需要显示error('Check the v3 for solving')的输出。

我不能使用,如果条件不止一次也需要从v得到的值。

+0

我现在需要从那个6中的哪一个是错误的,以便我可以写错误mesggage。我的问题是如何找到哪一个是错误的? –

+0

抱歉不明确。例如 我得到了一个结果v = [1,0,0,1,0,1]。是否有可能得到一个输出告诉v2,v3,v5是错误和错误消息('检查v2,v3,v5')。如果它是可行的,那么如何? –

回答

2

你不必做一切靠自己行这些比较,你可以使用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携带你怎么样,或者跳过声明​​并在错误的find声明直接使用V(:)而不是v中。

无论哪种方式,这基本上是一个单线程来创建你想要的错误,使用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; 
0

试试看find函数。你可以阅读关于它here

总之,你可以写:

idx = find(~v) 

这将使你中符合特定条件的项目的索引。 此外,这可用于打印您需要的错误信息。

显示一条消息,你可以使用:

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

这将打印出正确的信息感兴趣的所有索引。

+0

@Wolfie当然'find(〜v)'是正确的方式,这只是一个例子。尽管如此,编辑。根据提供的链接查找应该为逻辑值工作以及'数据类型:single |双| int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 |逻辑| char' – Dusteh

相关问题