2014-10-01 48 views
-2

這是一週中我意識到我在MATLAB中理解得有多少的時間。本週,我們有迭代的功課,所以使用for循環和while循環。我目前遇到的問題是我必須寫一個決定誰來僱用某人的函數。我給了一個名單,GPA列表和一個邏輯向量列表,告訴我一個學生是否留下來交談。我必須輸出的是要僱用的人員名單以及他們與招聘人員聊天的時間。使用for while while循環來確定誰要聘請MATLAB

function[candidates_hire, time_spent] = CFRecruiter(names, GPAs, stays_to_talk) 

爲了被錄用,一個canidate必須具有高於2.5(不含)的GPA。爲了被僱用,學生必須堅持談話,如果他們不說話,他們不會被錄用。名稱用','分隔,GPA是一個向量。

Time in minutes = (GPA - 2.5) * 4; 

到目前爲止我的代碼:

function[candidates_hire, time_spent] = CFRecruiter(names, GPAs, stays_to_talk) 

candidates = strsplit(names, ', '); 
%// My attempt to split up the candidates names. 
%// I get a 1x3 cell array though 

for i = 1:length(GPAs) 
    %// This is where I ran into trouble, I need to separate the GPAs 
    student_GPA = (GPAs(1:length(GPAs))); 
    %// The length is unknown, but this isn't working out quite yet. 
    %// Not too sure how to fix that 
    return 
end 

time_spent = (student_GPA - 2.5) * 4; %My second output 

while stays_to_talk == 1 %// My first attempt at a while-loop! 
    if student_GPA > 2.5 
%// If the student has a high enough GPA and talks, yay for them 
     student = 'hired'; 
    else 
     student = 'nothired'; %If not, sadface 
     return 
    end 
end 

hired = 'hired'; 
%// Here was my attempt to get it to realize how was hired, but I need 
%// to concatenate the names that qualify into a string for the end 
nothired = 'nothired'; 
canidates_hire = [hired]; 

什麼我的主要問題是,這裏是搞清楚如何讓函數知道他們的名字(1)具有GPA花了通話的時間由以下因素決定(1)。建議我啓動一個計數器,並且我必須確保我的循環保留了它們的名字。有這個問題的任何建議?請和謝謝:)

Test Codes 
[Names, Time] = CFRecruiter('Jack, Rose, Tom', [3.9, 2.3, 3.3],... 
           [false true true]) 
     => Name = 'Tom' 
      Time = 3.2000 
[Names, Time] = CFRecruiter('Vatech, George Burdell, Barnes Noble',... 
          [4.0, 2.5, 3.6], [true true true]) 
     => Name = 'Vatech, Barnes Noble' 
      Time = 10.4000 
+1

一般的建議:計算器不支持正確的代碼高亮MATLAB,用'%//'徵求意見,而不是隻''%你高度提高代碼的可讀性。 – thewaywewalk 2014-10-01 15:00:08

+1

這可以在沒有任何循環的情況下完成。你絕對需要使用'for'和'while'循環嗎? – rayryeng 2014-10-01 15:00:09

+1

夫婦更多問題:「名稱」的輸入類型是什麼?它是名稱的單元數組,其中每個名稱都是一個字符串?你還可以提供一些關於「names」,「GPAs」和「stays_to_talk」的樣子嗎?通常在StackOverflow中,如果您將問題與預期的輸入和輸出結合在一起,人們將能夠更快地回答您的問題。我沒有寫出答案,因爲我無法弄清楚函數的前兩個參數的輸入是什麼。 – rayryeng 2014-10-01 15:01:03

回答

2

我會用forwhile循環這個特定問題做了,主要是因爲你可以在非常完美地解決這個問題(我不騙你)線的代碼...以及四個如果你計算返回候選人的名字。另外,教你MATLAB的人(絕對沒有意圖的)並不知道他們在說什麼。 MATLAB中的#1規則是,如果你可以矢量化你的代碼,那麼做。但是,由於JIT(即時)加速器的性能增強,在某些情況下for環路非常適合。如果您好奇,可以通過check out this link瞭解有關JIT的更多詳情。不過,我可以保證在這種情況下使用循環會很慢。

我們可以分解你的問題分爲三個步驟:

  1. 決定誰呆在那裏說話。
  2. 對於那些堅持談話的人,請檢查他們的GPA,看他們是否是> 2.5
  3. 對於滿足(1)和(2)的人,通過在每個人的帖子中使用公式來計算花在說話上的總時間併合計時間。

我們可以用logical向量生成布爾數組,同時檢查步驟#1和#2,使我們可以索引到我們的GPA陣列是否指定。一旦我們這樣做,我們只需將公式應用於過濾後的GPA,然後總結花費的時間。因此,你的代碼是很乾脆:

function [candidates_hire, time_spent] = CFRecruiter(names, GPAs, stays_to_talk) 

    %// Pre-processing - split up the names 
    candidates = strsplit(names, ', '); 

    %// Steps #1 and #2 
    filtered_candidates = GPAs > 2.5 & stays_to_talk; 

    %// Return candidates who are hired 
    candidates_hire = strjoin(candidates(filtered_candidates), ', '); 

    %// Step #3 
    time_spent = sum((GPAs(filtered_candidates) - 2.5) * 4); 

你不得不分手了基於逗號的名稱正確的想法。 strsplit將包含您要查找的令牌的字符串(在您的情況下爲,)分割爲單元格數組內的單獨字符串。因此,您將獲得一個單元陣列,其中每個元素都有要接受採訪的人員的姓名。現在,我將步驟#1和步驟#2合併爲一個步驟,其中我計算了一個邏輯向量,告訴您哪些候選符合要求。然後,我用它來索引我們的候選人單元陣列,然後使用strjoin在一個字符串,其中每個名稱由,按您的示例輸出分開加入所有的名字在一起。

的最後一步是使用邏輯矢量索引到的GPA矢量,抓住從這些候選人誰是成功的那些的GPA,則公式應用到每個這些元件,並且總結它們。有了這個,這裏使用的是採樣輸入結果:

>> [Names, Time] = CFRecruiter('Jack, Rose, Tom', [3.9, 2.3, 3.3],... 
[false true true]) 

Names = 

Tom 


Time = 

    3.2000 

>> [Names, Time] = CFRecruiter('Vatech, George Burdell, Barnes Noble',... 
[4.0, 2.5, 3.6], [true true true]) 

Names = 

Vatech, Barnes Noble 


Time = 

    10.4000 

爲了滿足人民羣衆......

現在,如果你是絕對一意孤行使用for循環,我們可以更換步驟#1和#2通過使用循環和if條件以及一個計數器來跟蹤到目前爲止花費的總時間。我們還需要一個額外的單元格數組來跟蹤那些已通過要求的名稱。作爲這樣:

function [candidates_hire, time_spent] = CFRecruiter(names, GPAs, stays_to_talk) 

    %// Pre-processing - split up the names 
    candidates = strsplit(names, ', '); 

    final_names = []; 
    time_spent = 0; 
    for idx = 1 : length(candidates) 
     %// Steps #1 and #2 
     if GPAs(idx) > 2.5 && stays_to_talk(idx) 
      %// Step #3 
      time_spent = time_spent + (GPAs(idx) - 2.5)*4; 
      final_names = [final_names candidates(idx)]; 
     end 
    end 

    %// Return candidates who are hired 
    candidates_hire = strjoin(final_names, ', '); 

與上面的代碼訣竅是,我們保持一個附加單元陣列周圍,其存儲已經經過的那些候選。然後,我們會像以前一樣將所有字符串連接到每個名稱之間的,。您還會注意到,在檢查兩種方法之間的步驟#1和#2方面存在差異。特別地,存在在第一方法的&和在第二方法的&&。單個&用於數組和矩陣,而&&用於單個值。如果你不知道那個符號是什麼,那就是logical AND的符號。這意味着什麼是真實的,只有當&的左側和&右側兩個都是真實的。就你而言,這意味着有一個GPA爲> 2.5的人,如果他們被錄用,他們都必須是真的。