首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >人格测验MATLAB

人格测验MATLAB
EN

Stack Overflow用户
提问于 2014-09-29 16:33:40
回答 1查看 337关注 0票数 2

我很抱歉问了这些人,但是这个问题已经困扰我一个星期了。我现在应该能想出办法的,但我似乎无法使它发挥作用。我需要做的是人格测试的代码。它是基于这个圆圈:

代码语言:javascript
复制
                            1
                        10        2

                     9               3

                     8               4

                        7         5
                             6        

所以我已经得到了我的投入。我有三个: type1,pVec1和subType1。pVec是一个向量,我假设我必须索引它。type1被赋予了我显性或隐性的特质。我要做的是,决定我的其他特质是什么。如果他们给了我我的优势,第一个字母就会大写。如果是隐性的,那就是小写。显性性状和隐性性状总是相互对立的。如果我有一个显性人格类型3,我的隐性将是类型8(使用圆圈)。此外,我的翅膀性格类型是基于我的主导类型。它们是左边和右边的数字(在这种情况下,2和4将是我的翼性格类型),.The子类型只是告诉我是否要添加一些关于我的主导类型的东西。

代码语言:javascript
复制
 Test Cases:
      type1 = 'helper';
      pVec1 = ['Reformer Helper Achiever Individualist Dreamer Investigator    
               Loyalist Enthusiast Challenger Peacemaker'];
    subType1 = 'alone';
[dom1, rec1, wings1] = personalityTest(type1,pVec1,subType1);
      dom1 > 'Loyalist_a'
      rec1 => 'Helper'
       wings1 => 'Enthusiast Investigator'

所以我得让它做那样的事。到目前为止,我已经:

代码语言:javascript
复制
 function[dominant, recessive, wings] = personalityTest(type, pVec, subtype)
 type_list = strsplit(pVec);

 position = find(strcmpi(type, type_list), 1, 'first');
 dominant = upper(type(1));
 dominant = char(type);
 recessive = lower(type(1));
 recessive = char(type);
 switch type
case recessive
    dominant = position + 5;
case dominant
    recessive = char(dominant - 5);
 end

 leftwing = char(dominant + 1);
 rightwing = char(dominant - 1);

 wings = [leftwing rightwing];
 if strcmp(subtype, 'alone')
    dominant = [dominant '_a'];
elseif strcmp(subtype, 'smallGroup')
    dominant = [dominant, '_s'];
else 
    dominant = [dominant, '_1'];
end

我的函数一直给我一个空白作为主导(或者仅仅是_a)。我该怎么解决这个问题?我想让它在第五个位置给我一个词。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-29 19:40:17

逐步执行您的代码将有助于向您揭示错误。

代码语言:javascript
复制
type = 'helper';
pVec = ['Reformer Helper Achiever Individualist Dreamer Investigator    
          Loyalist Enthusiast Challenger Peacemaker'];
subType = 'alone';

执行函数的下列行

代码语言:javascript
复制
 type_list = strsplit(pVec);

 position = find(strcmpi(type, type_list), 1, 'first');
 dominant = upper(type(1));
 dominant = char(type);
 recessive = lower(type(1));
 recessive = char(type);

结果将dominantrecessive设置为以下值

代码语言:javascript
复制
dominant = 'helper'
recessive = 'helper'

我认为,这里的意图是确定类型字符串的第一个字符是大写还是小写。换句话说,我们需要一个TrueFalse值来表示dominantrecessive

函数upper()将输入的stringchar转换为大写。若要检查第一个字符是大写还是小写,请尝试

代码语言:javascript
复制
dominant  = type(1) == upper(type(1))
recessive = type(1) == lower(type(1))

赋值

代码语言:javascript
复制
dominant = char(type);
recessive = char(type);

是不必要的(它们覆盖了您以前的计算!)

现在,下一行代码将更接近于生成正确的输出。

代码语言:javascript
复制
switch type
case recessive
    dominant = position + 5;
case dominant
    recessive = char(dominant - 5);
end

这里有三个(也许是四个)问题。

  1. dominant = position + 5。如果position的值为9,那么dominant将等于14。因为这里的目的是使用dominant索引到类型列表中,因此可能会产生数组索引超出界限的错误。解决这个问题的方法是使用模数(余数)函数,即dominant = (position + 4) % 10 + 1。余数函数基本上是“除以(p + 5)后的余数是什么”,奇怪的1和4是将可能分配给dominant的值范围保持在1,10以内。
  2. 如果人格特征向量(pVec)总是长度为10,那么将5硬编码到计算中是可以的。但是,如果pVec的长度可以改变,那么您需要确定正确的值来增加位置。如果长度是偶数,那么应该是length(pVec)/2
  3. 在当前的代码迭代中,recessive = char(dominant - 5)行将计算为recessive = char('helper' - 5)。这实际上没有意义,因为您正在从字符串中减去一个整数,然后再转换为一个字符串。相反,在类型列表中计算隐性性状的索引。这与2中概述的过程完全相同。
  4. 使用变量名来表示它们所做的工作,将有助于您更清楚地考虑代码。
  5. 目标是使用dominantrecessive作为type_list的索引。您忘记在每个开关情况下设置两个索引中的一个。

下一行代码:

代码语言:javascript
复制
leftwing = char(dominant + 1);
rightwing = char(dominant - 1);

索引到type_list,以获得正确的值为左和右翼。注意数组索引超出界限的错误。

下一行:

代码语言:javascript
复制
wings = [leftwing rightwing];
if strcmp(subtype, 'alone')
    dominant = [dominant '_a'];
elseif strcmp(subtype, 'smallGroup')
    dominant = [dominant, '_s'];
else 
    dominant = [dominant, '_1'];
end

同样,索引问题。把这些修好你就可以自由回家了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26104678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档