How to randomly generate one non-zero element of each row from a matrix
Afficher commentaires plus anciens
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]...
Réponses (2)
Rik
le 3 Juil 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 commentaires
Chaoyang Jiang
le 3 Juil 2018
Dennis
le 3 Juil 2018
A=[1 5 6 7 0; 2 0 0 4 2; 0 0 3 4 0];
tic
for i=1:10000
[rows,~]=size(A);
B=zeros(rows,1);
for k=1:rows
le=find(A(k,:));
le=le(randi(length(le)));
B(k)=A(k,le);
end
end
toc
Elapsed time is 0.114470 seconds.
Stephen23
le 3 Juil 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?
Chaoyang Jiang
le 3 Juil 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)
Catégories
En savoir plus sur Logical dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!