How to randomly generate one non-zero element of each row from a matrix
4 views (last 30 days)
Show older comments
How to randomly generate one non-zero element of each row from a matrix and then create a new matrix?
For A=[1 5 6 7 0; 2 0 0 4 2; 0 0 3 4 0]; I want to have a random vector B where each element in B (non-zero) is randomly generated from A. e.g., B=[1,2,3] or [5 4 3] or [7 2 3]...
0 Comments
Answers (2)
Rik
on 3 Jul 2018
There's probably a faster way, but the code below should work.
A=[1 5 6 7 0; 2 0 0 4 2; 0 0 3 4 0];
A_cell=cellfun(@(x) x(x~=0),...
mat2cell(A,ones(1,size(A,1)),size(A,2)),...
'UniformOutput',false);
B=arrayfun(@(x) x{1}(randi(numel(x{1}))),A_cell);
4 Comments
Stephen23
on 3 Jul 2018
"This line might in a loop that will be repeated 10,000 times. I am hoping there will be an efficient way."
@Chaoyang Jiang: why not just generate all random selection at once? Is a loop strictly required?
Stephen23
on 3 Jul 2018
Edited: Stephen23
on 3 Jul 2018
In two lines:
>> A = [1,5,6,7,0;2,0,0,4,2;0,0,3,4,0];
>> [R,C] = find(A);
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
5
2
3
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
7
2
3
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
5
2
3
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
6
4
3
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
7
2
3
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
6
2
4
>> accumarray(R,A(A~=0),[],@(v)v(randi(numel(v))))
ans =
5
2
3
Or slightly more clearly:
[R,~] = find(A);
fun = @(v)v(randi(numel(v)));
B = accumarray(R,A(A~=0),[],fun)
0 Comments
See Also
Categories
Find more on Shifting and Sorting Matrices 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!