# replace zeros according to distribution of integers in each column

1 view (last 30 days)
J T on 22 Oct 2016
Commented: J T on 23 Oct 2016
if I have some matrix x of randomly distributed values (value 0 to n = 5 or 10 in this case)
x = [binornd( 5, 0.05, 10000, 1 ), binornd( 10, 0.1, 10000, 1 )];
I want to create a second matrix where any zeros in x are replaced at random by a value from 1 to n according to the distribution when zero is excluded in that particular column. I want to do this by random sampling from the values in each column excluding zero.
Any ideas how to do this quickly (in reality the matrices are considerably bigger than this example...)

Guillaume on 22 Oct 2016
Edited: Guillaume on 22 Oct 2016
If I understand correctly, you want to replace all zeros in a column by random non-zero values from the same column? In which case:
replacementcount = sum(x == 0);
for column = 1:size(x, 2)
validvalues = nonzeros(x(:, column));
x(x(:, column) == 0, column) = validvalues(randperm(numel(validvalues), replacementcount(column)));
end
J T on 23 Oct 2016
Thanks for the reply and help!

Andriy Kavetsky on 22 Oct 2016
You can try this n=10; or n=5; and x(x==0)=randi(n)

### Categories

Find more on Logical in Help Center and File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by