根据输入案例MATLAB使功能不同

时间:2014-09-28 20:30:06

标签: matlab if-statement for-loop switch-statement case

所以我的代码出现问题(因此我问这个问题的原因)。我的目标是编写一个函数,根据输入的情况,它具有不同的输出。我不得不担心三种不同的情况:double,logical和char。我已经处理过双重案例,而且代码工作正常。我和其他两个案件有问题。

这是我必须为逻辑情况做的事情:如果第一个输入是逻辑类,那么第二个输入保证代表一个数字并且长度为1.但是,第二个输入可以在double和char类之间变化。所以它可以是[5]或'#',这是非常不同的。对于这种情况下的第一个输出,只需输出与第一个输入相反的输出。例如,如果你的第一个 输入是[true false false true],那么你的第一个输出应该是[false true true false]。对于这种情况下的第二个输出,检查第二个输入中表示的数字是否为偶数,并输出 一个单一的真或假,真的是数字是偶数。如果该输入的类是double,那么只需将第二个输出保留为逻辑类。如果第二个输入的类是char,则输出一个' True'或者“假”'而不只是一个逻辑值。

示例:

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

我得到假(作为0)但我的第二个输出是' 1 1'。我需要它是' True'

对于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

我无法运行我的第三个测试用例' [out1,out2] = ifOnlyIfOnly(' Hello',' Worldddd')'因为它一直在标记我的isnumeric部分顶部。

1 个答案:

答案 0 :(得分: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) 

也一样。

可以使用该匿名函数完成从布尔值到char的转换:

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

正如您所看到的,您可以使用布尔值进行线性索引,转换为double将由+完成。

使用strcmp比较字符串的内容,而不是长度。请改用numel

对于char案例:不要检查哪个字符串更短,无论如何都要缩短它们。如果没有较短的字符串,则没有什么可以缩短的。很好。


正如你之前的回答所知,我不喜欢过多的条件。或者,您可以使用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