2017-08-31 59 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

相關問題