Извлечение соответствующих значений определенного числа из большой матрицы - PullRequest
1 голос
/ 17 января 2020

У меня есть матрица матрицы 2х5000 со значением стимула (от 1 до 7) и соответствующими ответами. Значения стимула случайным образом разбросаны по данным. Например:

2   0
3   1
3   1
1   1
7   0
6   0
7   1
6   1
1   0
1   0
7   1
6   1
4   1

Мне нужно вычислить среднее значение ответов для каждого значения стимула (например, мне нужно 7 средств здесь).

Но я не знаю, как разделить значения и соответствующие им значения в разных переменных (например, как извлечь 6 и соответствующие ему данные).

Становится сложнее для второй подобной матрицы с добавлением шума к исходным значениям, где у меня была надежда извлечь от 1 до 1,9, ... от 6 до 6,9 и соответствующие значения.

Я пытался найти (data_experiment == 4) (например), и он возвращает позиции всех 4 в моей матрице 2x5000, но я не знаю, как извлечь соответствующие данные.

Есть ли что-нибудь лучше, чем «найти»?

Кто-нибудь может подсказать, какие функции можно использовать?

1 Ответ

2 голосов
/ 17 января 2020

Вы можете использовать функцию accumarray , которая была разработана для ее решения:

Вот пример кода:

D = [2   0
     3   1
     3   1
     1   1
     7   0
     6   0
     7   1
     6   1
     1   0
     1   0
     7   1
     6   1
     4   1];

%Compute sums: 
%Result: S(1) sumSecCol(where FirstCol = 1), S(2) = sumSecCol(where FirstCol = 2), S(3) = sumSecCol(where FirstCol = 3), 
S = accumarray(D(:,1), D(:,2));

%Compute count (replace D(:,2) with "1"s):
C = accumarray(D(:,1), ones(size(D,1), 1));

%Remove zeros from C - to avoid division by zero
C = max(C, 1);

%Compute mean
M = S ./ C;

Результат:

M =

    0.3333
         0
    1.0000
    1.0000
         0
    0.6667
    0.6667

Для случая шума "от 1 до 1,9, ... от 6 до 6,9" можно использовать функцию floor:

D = floor(D);

от 1 до 1,9999 переходит к 1, 2 к 2.9999 переходит к 2 ...

Похоже, round является более субтитром, но описанная вами операция применима floor.


Вот решение, использующее для l oop без accumarray:

S = zeros(7, 1);
C = zeros(7, 1);

D1 = D(:, 1); %First column
D2 = D(:, 2); %Second column

for i = 1:7
    S(i) = sum(D2(D1 == i));
    C(i) = sum(D1 == i);
end

M = S ./ max(C, 1);

Вместо find рекомендуется использовать логический индексирование как указано выше.

...