矩阵比率|矩阵/向量| if语句/循环|

时间:2018-09-03 12:22:51

标签: matlab for-loop if-statement

我想知道您将如何解释下面的函数以使用矩阵而不是向量输入,实质上,我只是在该列中找到所有超过某个值的所有值,然后将其相加并除以总行数即可得出比率。下面是矢量输入的工作原理,但我不太确定如何用矩阵输入完成输入。我应该改用logical吗?

如果列数超过2,我选择的方法将不起作用,但我希望它可以容纳任何大小。

function Ratio = ratiovector(Vector)

N = numel(Vector);
c=0

for a = 1:N

    if Vectors(a) >= 20
        c=c + 1;
    end
    end


Ratio = c/N;
end

矩阵输入

function Ratio = ratiovector2(Matrix)

rows = Matrix(:,1)
columns = Matrix(:,2)
c = 0
d = 0

for a = 1:rows
    for b =1:columns

    if Matrix(a) >= 20
        c= c + 1;
    if Matrix(b) >= 20
        d= d + 1;
    end
    end


Ratio = ?;
end

2 个答案:

答案 0 :(得分:3)

对我来说,要如何标准化比率还不是很清楚,但是下面的函数是一个起点,它适用于矩阵和向量。它使用逻辑索引而不是for循环,这可能会具有更好的性能。

M = [0  1  2  5  22 ; 
     32 1  1  7  22 ; 
     10 10 10 10 20];

Ratio = ratiovector2(M)


function Ratio = ratiovector2(Matrix)

    % This will give you a boolean matrix the same size of Matrix, with
    % true values where Matrix elements are higher than 20
    detected = Matrix > 20;

    % The ratio is "how many are over 20 in each column"
    Ratio = sum(detected) ./ size(Matrix,1);
end

如果您需要一个功能并且喜欢单线包装,请按以下步骤操作:

ratiovector3 = @(Matrix)sum(Matrix > 20) ./ size(Matrix,1);

Ratio = ratiovector3(M)

答案 1 :(得分:3)

您在注释中阐明,希望每列中的元素数超过阈值,超过矩阵中的行数。

这是一种快速的单线(阈值为20):

ratio = sum(M>20, 1) / size(M, 1);

打破这一点,我们有

    M > 20;                 % logical array which is 1 where M > 20, 0 otherwise
sum(M > 20, 1);             % column-wise sum of the logical
sum(M > 20, 1) / size(M,1)  % Divide the sum by the number of rows to get ratio.

这将适用于任何列向量或矩阵。

示例:

M = [10, 15, 20, 100
     21,  0, 21, 101
      0,  0, 21, 102];

ratio = sum(M>20, 1) / size(M, 1);
% >> ratio = [0.333..., 0.0, 0.666..., 1.0] = [1/3, 0/3, 2/3, 3/3]