2014-09-28 15 views
1

所以我遇到了我的代碼問題(因此我在問這個問題)。我的目標是編寫一個函數,根據輸入的情況具有不同的輸出。我不得不擔心三種不同的情況:雙重,邏輯和字符。我已經處理了雙重情況,並且代碼工作得很好。我與其他兩個案件有問題。根據輸入案例的不同,製作函數的行爲不同MATLAB

這是我必須要做的邏輯情況:如果第一個輸入是邏輯類,那麼第二個輸入保證代表一個數字並且長度爲1.但是,第二個輸入可以在double和char之間變化類。所以它可以是[5]或者'5',這是非常不同的。對於這種情況下的第一個輸出,只需輸出第一個輸入的相反。例如,如果您的第一個輸入是[true false false true],那麼您的第一個輸出應該是[false true true false]。對於這種情況下的第二個輸出,請檢查第二個輸入中表示的數字是否爲偶數,並輸出 單個true或false,true表示數字是偶數。如果該輸入的類是雙重的,那麼簡單地把這個第二個輸出作爲邏輯類。如果第二個輸入的類是char,那麼輸出一個'True'或'False'的字符串,而不是一個邏輯值。

實施例:

[out1, out2] = ifOnlyIfOnly(true, '22') 
    out1 = false %logical class 
    out2 = 'True' %as a string 

我得到假(作爲0),但我的第二輸出爲 '1 1'。我需要它是'真實的'

對於char的情況:char:如果第一個輸入是char類,那麼第二個輸入始終保證是另一個字符串。您將需要找到哪個字符串更長,並從中移除超過較短字符串長度的索引。您的第一個輸出將是兩個字符串 連接在一起,並且它們之間有一個空格,第二個輸出將是false的單個true:如果輸入的字符串本來是相同的長度,則爲true;如果它們不是,則爲false縮短一個。如果您必須縮短其中一個輸入的字符串,那麼該字符串的縮短版本應該是您用於將它們連接在一起以用於第一個輸出的內容。

function[Output1, Output2] = ifOnlyIfOnly(input1, input2) 

if isnumeric(input1) == 1 
    Output1 = input1/sum(sum(input2)); 
    Output2 = input2 .* input1; 
end 
%Works perfectly here^
if islogical(input1) == 1 && ischar(input2) == 1 
    Output1 = ~input1; 
%My Output1 works correctly 
    Output2 = char((mod(input2, 2) == 0; 
%I need to figure out how to convert from a logical case to a char case here. 
%Should I do something along the lines of num2str here? 
elseif islogical(input1) == 1 && isnumeric(input1) == 1 
    Output1 = ~input1; 
    Output2 = mod(input2, 2) == 1; 
end 
    if ischar(input1) == 1 
    switch input1 
     case strcmp(input1, input2) == 1 
      Output1 = [input1 ' ' input2]; 
      Output2 = false; 
    end 

,因爲它一直萎靡不振的我爲ISNUMERIC部分往上頂我不能運行我的第三個測試用例 '[OUT1,OUT2] = ifOnlyIfOnly(' 你好 ' 'Worldddd')'。

回答

1

嘗試,如果你是這樣的:

bool2char = @(x) getfield({'false','true'}, {x+1}); 

if isnumeric(input1) 
    Output1 = input1/sum(sum(input2)); 
    Output2 = input2 .* input1; 
end 

if islogical(input1) && ischar(input2) 
    Output1 = ~input1; 
    Output2 = bool2char(~(mod(str2double(input2), 2))); 

elseif islogical(input1) && isnumeric(input2) 
    Output1 = ~input1; 
    Output2 = ~(mod(input2, 2)); 
end 

if ischar(input1) 
    n1 = numel(input1); n2 = numel(input2); 
    n = min([n1,n2]); 
    Output1 = [input1(1:n) ' ' input2(1:n)]; 
    Output2 = ~(n1-n2); 
end 

一些言論:

結構,如

if islogical(input1) == 1 && ischar(input2) == 1 

是毫無意義的

if islogical(input1) && ischar(input2) 

也是這樣。

從布爾燒焦的轉換可以用匿名函數來完成:

bool2char = @(x) getfield({'false','true'}, {x+1}); 

正如你可以看到你可以做的布爾值線性索引,以兩倍的轉換是通過+完成。

strcmp比較字符串的內容,而不是它們的長度。改爲使用numel

對於字符的情況:不要檢查哪個字符串更短,只是縮短它們。如果沒有更短的字符串,沒有什麼可以縮短的。還不錯。


正如你從我之前的回答中所知道的,我不喜歡太多if條件。或者,你可以使用switchcase來讓你的代碼更加苗條。

switch class(input1) 
    case 'double' 
     Output1 = input1/sum(sum(input2)); 
     Output2 = input2 .* input1; 
    case 'logical' 
     if ischar(input2) 
      Output1 = ~input1; 
      Output2 = bool2char(~(mod(str2double(input2), 2))); 
     else 
      Output1 = ~input1; 
      Output2 = ~(mod(input2, 2)); 
     end 
    case 'char' 
     n1 = numel(input1); n2 = numel(input2); 
     n = min([n1,n2]); 
     Output1 = [input1(1:n) ' ' input2(1:n)]; 
     Output2 = ~(n1-n2); 
end 
+0

我從來沒有真正學過整個bool2char轉換,或從技術上講,但我之前已經看過numel。我會試着用長度來代替,但是你所做的一切都是有道理的。它工作正常:)我感謝它! – 2014-09-28 21:50:34

+0

那麼沒有真正的bool2char轉換。該函數只提供了一個單元格數組,其中包含兩個可能的字符串,並且getfield允許訪問同一行內的單元格。 – thewaywewalk 2014-09-28 21:56:35

+0

噢......我們還沒有了解到這些,但是如果我能看到它的工作原理,我就願意使用它。抽象ftw。開關語句確實使它看起來更漂亮。儘管我仍在努力理解它們。 – 2014-09-28 22:10:45

相關問題