2012-11-10 60 views
1

我停留在如何在100x100的矩陣檢查有多少數量大於25下面是我的代碼至今:MATLAB - 這個矩陣中給定數字大於25的概率是多少?

loop = 1:100; 
RandomNumbers = normrnd(0, 25, [100, 100]); 
NumberCounter = 0; 
for i = 1:10000 
    if i >= 1 
     if (RandomNumbers(loop, 100) > 25) 
      NumberCounter = NumberCounter + 1 
     elseif (RandomNumbers(100, loop) > 25) 
      NumberCounter = NumberCounter + 1 
     end 
    end 
end 

我NumberCounter變量沒有更新......它只是停留在零。感謝任何幫助,並解釋爲什麼你做了你所做的事情,因爲我想學習。

回答

6

首先,讓我用它做什麼註釋代碼:

% This creates a list of numbers, 1 through 100 inclusive 
loop = 1:100; 
% This generates a 100x100 random matrix drawn from a normal distribution 
% with mean 0 and standard deviation 25 
RandomNumbers = normrnd(0, 25, [100, 100]); 
NumberCounter = 0; 
for i = 1:10000 
    % This loop only runs over i from 1 to 10000, so i>=1 is always true. 
    % This if statement is unnecessary. 
    if i >= 1 
     % Remember that loop is a _list_ of numbers: RandomNumbers(loop, 100) 
     % is the whole 100th column of your random matrix, and so 
     % RandomNumbers(loop, 100)>25 is a _list_ of 100 boolean values, 
     % corresponding to whether each element of the 100th column of your matrix 
     % is greater than 25. By default, Matlab only treats a list of values as 
     % true if they are _all_ true, so this if-statement almost never evaluates 
     % to true. 
     if (RandomNumbers(loop, 100) > 25) 
      NumberCounter = NumberCounter + 1 
     % This test is doing the same thing, but testing the 100th row, instead of 
     % the 100th column. 
     elseif (RandomNumbers(100, loop) > 25) 
      NumberCounter = NumberCounter + 1 
     end 
    end 
end 

你正在試圖做的是什麼正確的代碼:

RandomNumbers = normrnd(0, 25, [100, 100]); 
NumberCounter = 0; 
for i = 1:size(RandomNumbers,1) 
    for j = 1:size(RandomNumbers,2) 
     if RandomNumbers(i,j) > 25 
      NumberCounter = NumberCounter + 1; 
     end 
    end 
end 

我還要提到的是一個更快,更簡潔的方式做你想做的事情將是以下幾點:

RandomNumbers = normrnd(0, 25, [100, 100]); 
flatVersion = RandomNumbers(:); 
NumberCounter = sum(flatVersion > 25); 

This works becaus e RandomNumbers(:)將矩陣展開爲單個向量,並且因爲sum爲每個真值計數1,並且每個假值爲0。

+0

感謝您的好評!我有點困惑,你爲這兩個for循環做了什麼:對於i = 1:size(RandomNumbers,1) for j = 1:size(RandomNumbers,2)請你詳細說明一下嗎? – heinst

+1

'size(RN,1)'返回矩陣'RN'中的行數,'size(RN,2)'返回列數。這意味着'i'遍歷所有行,'j'遍歷所有列。 – Isaac

+0

非常感謝您的幫助...我真的很感激 – heinst

1

您正在循環一行是行100,而一列是列100。你不會考慮矩陣中的所有元素。你需要有一個嵌套for循環。一個越過行,另一個越過行。

例如:

for i = 1:100 
    for j = 1:100 
     if i >= 1 
      if (RandomNumbers(loop(i), loop(j)) > 25) 
       NumberCounter = NumberCounter + 1 
      end 
     end 
    end 
end 

我希望這有助於!

4

對於這個問題,你不需要使用顯式循環(它也很慢)。

ans = 
Columns 1 to 34 
0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 
0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 
0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 
1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 
1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 
1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 

. 
. 
. 

期望的結果是那麼該矩陣的所有元素的總和:其中每個元素是1,如果在RandomNumbers相應的元素爲大於25,否則爲0

RandomNumbers > 25將返回一個矩陣。 sum(RandomNumbers > 25)將返回每一列的總和矩陣:

ans = 
Columns 1 to 26 
45 47 55 54 57 52 55 50 57 52 53 47 53 46 51 49 49 42 50 52 54 37 45 48 53 48 
Columns 27 to 52 
51 50 51 53 49 49 48 43 49 49 53 51 52 45 54 49 53 54 48 48 46 46 49 52 47 52 
Columns 53 to 78 
45 44 43 54 50 49 38 50 54 48 50 39 53 46 54 51 53 49 47 46 44 43 48 56 51 44 
Columns 79 to 100 
47 51 58 58 55 41 49 49 43 48 45 52 52 43 54 51 48 55 54 55 44 47 

這個向量的應用和爲我們想要的結果。因此,要檢查如何在100x100的矩陣多的數字大於25,只需使用:

sum(sum(RandomNumbers > 25)) 

這也是很多,要快得多。

相關問題