2014-09-28 13 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

相关问题