Соотношения в матрице | Матрица / Вектор | оператор if / loop | - PullRequest
0 голосов
/ 03 сентября 2018

Мне было интересно, как бы вы объяснили нижеприведенную функцию для работы с матрицей вместо векторного ввода, по сути, я просто нахожу все значения, превышающие определенное значение в этом столбце, и складываю их и делю на общее количество строк, чтобы получить соотношение , Ниже работает для векторного ввода, но я вроде не уверен, как завершить один с матричным вводом. Должен ли я использовать 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 голосов
/ 03 сентября 2018

Вы пояснили в комментариях, что хотите, чтобы количество элементов в каждом столбце превышало пороговое значение, а не количество строк в матрице.

Это быстрый однострочник (при пороговом значении 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]
0 голосов
/ 03 сентября 2018

Мне не очень понятно, как вы хотите нормализовать ваше отношение, но функция ниже является отправной точкой, и она работает для матриц и векторов. Он использует логическое индексирование, а не циклы 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...