1

100x100マトリックスの数値が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変数が更新されていません...ゼロのままです。私が学びたいので、なぜあなたがしたことをしたのかについての説明とともに、どんな助けもありがたいです。

4

3 に答える 3

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);

これが機能するRandomNumbers(:)のは、行列を1つのベクトルに展開し、sum真の値ごとに1をカウントし、偽の値ごとに0をカウントするためです。

于 2012-11-10T06:51:51.933 に答える
4

この問題では、明示的なループを使用する必要はありません(これも非常に低速です)。

RandomNumbers > 25RandomNumbersの対応する要素が25より大きい場合は各要素が1であり、それ以外の場合は0である行列を返します。

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

 .
 .
 .

望ましい結果は、この行列のすべての要素の合計です。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))

また、はるかに高速です。

于 2014-03-11T21:19:57.453 に答える
1

行100である1つの行と、列100である1つの列をループしています。マトリックス内のすべての要素を調べているわけではありません。forネストされたループが必要です。1つは行を越え、もう1つは行を越えます。

例えば:

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

これがお役に立てば幸いです。

于 2012-11-10T06:43:15.500 に答える