2014-09-29 41 views
2

我很抱歉問這個傢伙,但這個問題一直是我一個星期存在的禍根。我現在應該已經能夠弄清楚了,但我似乎無法讓它起作用。我需要做的是編碼進行個性測試。它基於這個圈子:個性測試MATLAB

      1 
         10  2 

        9    3 

        8    4 

         7   5 
          6   

所以我已經有我的輸入給我了。我有三個:type1,pVec1和subType1。 pVec是我假設我必須索引的一個向量。 type1給我的是我的顯性或隱性特徵。我所要做的就是確定我的其他特徵。如果他們給我我的主要特徵,那麼第一個字母將會被大寫。如果它是隱性的,則是小寫字母。顯性和隱性特質總是相互對立的。如果我有3型顯性人格,我的隱性將是8型(使用圓圈)。此外,我的翅膀個性類型是基於我的主導類型。它們是左邊和右邊的數字(在這種情況下,2和4是我的翼型人格類型)。子類型只是告訴我是否添加關於我的主導類型的內容。

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' 

所以我必須讓它做這樣的事情。到目前爲止,我有:

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)。我如何解決這個問題?我想讓它在第五位給我這個詞。

+0

既然神經科學用「性格測試」的東西來顯示它的顏色! – Divakar 2014-09-29 16:40:31

+0

那個男人,那是心理學 – 2014-09-29 16:43:03

+0

那些與大腦/頭腦事物有關的東西不是那些相關的東西嗎? :) – Divakar 2014-09-29 16:45:26

回答

3

單步執行代碼將有助於向您揭示錯誤。

type = 'helper'; 
pVec = ['Reformer Helper Achiever Individualist Dreamer Investigator  
      Loyalist Enthusiast Challenger Peacemaker']; 
subType = 'alone'; 

執行

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被設置爲這些值

dominant = 'helper' 
recessive = 'helper' 

這裏的目的,我認爲你的函數的後續行,就是要確定類型字符串的第一個字符是大寫或小寫。換句話說,我們需要TrueFalse的值爲dominantrecessive

函數upper()將輸入stringchar轉換爲大寫。要檢查第一個字符是大寫或小寫,儘量

dominant = type(1) == upper(type(1)) 
recessive = type(1) == lower(type(1)) 

的分配

dominant = char(type); 
recessive = char(type); 

是不必要的(它們將覆蓋以前的計算!)。

現在下一行代碼將更接近於產生正確的輸出。

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)通過10分割後的餘數。怪異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的索引。您忘記在每個開關盒中設置2個索引中的1個。代碼

下一頁線:

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

指數爲type_list獲得的左右兩翼正確的價值觀。小心數組索引超出界限的錯誤。

下一頁線:

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

再次,索引問題。解決這些問題,你可以免費回家。