Effacer les filtres
Effacer les filtres

How to randomly generate one non-zero element of each row from a matrix

2 vues (au cours des 30 derniers jours)
Chaoyang Jiang
Chaoyang Jiang le 3 Juil 2018
Modifié(e) : Stephen23 le 3 Juil 2018
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
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
Stephen23
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
Chaoyang Jiang le 3 Juil 2018
Yes, as each loop is independent and has totally different A.

Connectez-vous pour commenter.


Stephen23
Stephen23 le 3 Juil 2018
Modifié(e) : Stephen23 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 Shifting and Sorting Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by