所以我的代码出现问题(因此我问这个问题的原因)。我的目标是编写一个函数,根据输入的情况,它具有不同的输出。我不得不担心三种不同的情况: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部分顶部。
答案 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案例:不要检查哪个字符串更短,无论如何都要缩短它们。如果没有较短的字符串,则没有什么可以缩短的。很好。
正如你之前的回答所知,我不喜欢过多的条件。或者,您可以使用switch
和case
让您的代码更加苗条。
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