Как я могу назначить среднее значение столбца для определенных значений в этом столбце матрицы? - PullRequest
2 голосов
/ 10 марта 2011

Я хочу что-то вроде:

Mu = mean(X);  % column-wise means
X(X == 0) = Mu(current_column);  % assign the mean value of the current column
                                 %   to the zero-element

Но как мне сообщить MATLAB, что я хочу присвоить среднее значение текущего столбца (т. Е. Столбца, в котором находится текущее нулевое значение) записи матрицы при текущем нулевом значении?

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Вот векторизованное решение, которое быстрее, чем использование BSXFUN , и не требует репликации массива столбцов. Он просто находит соответствующий индекс столбца для каждого линейного индекса, который нужно изменить, а затем использует этот индекс для получения правильного среднего значения столбца:

colMeans = mean(X);    %# Get the column means
index = find(X == 0);  %# Get the linear indices of the zero values
colIndex = ceil(index./size(X,1));  %# Get the column index for each linear index
X(index) = colMeans(colIndex);      %# Reassign zeroes with the column means

А вот и тестовый пример:

>> X = randi([0 1],5)  %# Generate a random matrix of zeroes and ones

X =

     0     1     0     1     0
     1     0     0     1     1
     0     1     0     1     0
     1     1     1     0     1
     0     1     0     0     1

>> colMeans = mean(X);
>> index = find(X == 0);
>> colIndex = ceil(index./size(X,1));
>> X(index) = colMeans(colIndex)

X =

    0.4000    1.0000    0.2000    1.0000    0.6000
    1.0000    0.8000    0.2000    1.0000    1.0000
    0.4000    1.0000    0.2000    1.0000    0.6000
    1.0000    1.0000    1.0000    0.6000    1.0000
    0.4000    1.0000    0.2000    0.6000    1.0000
2 голосов
/ 10 марта 2011

Вы можете сделать массив такой же формы, как X, содержащий по столбцам средние значения:

means = repmat(mean(X), [size(X,1) 1]);
X(X==0) = means(X==0);

[ИЗМЕНЕНО, чтобы добавить ...]

Или, если явное расширение массива вас обидит, вы можете сделать это:

X = bsxfun(@(x,y)(x+(x==0)*y), X, mean(X));

, что немного «умно» на мой вкус, но, кажется, примерно на 25% быстрее в одном тестируемом случае (массив 1000x1000, около 10% которого составляют нули).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...