From a matrix, Pick one element from each row and not from same column for all possibilities. Only for non zero elements.
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
MeMariah
am 8 Jul. 2020
Kommentiert: MeMariah
am 20 Sep. 2020
Hi, From a matrix, I would like to pick one element from each row and not from same column for all possibilities.
Only for non zero elements.
Example, from A = [1 2 0; 1 2 0; 0 0 3], I want to obtain (1 2 3 and 2 1 3).
Thank you
0 Kommentare
Akzeptierte Antwort
Puru Kathuria
am 22 Jul. 2020
Hi,
Your requirements are answered in a similar question mentioned in this link. Also, selecting set of elements from a matrix such that each element comes from distinct row and column can also be modeled as a Matching problem. (graph theory)
Weitere Antworten (1)
Bruno Luong
am 23 Jul. 2020
Bearbeitet: Bruno Luong
am 23 Jul. 2020
A dynamic programming for fun
function p = nzperm(A,c)
if nargin < 2
c = 1;
end
r = find(A(:,c));
if isempty(r)
p = [];
elseif c==size(A,2)
p = A(r,c); % p = r(:);
else
p = [];
for i=r.'
Ai = A;
Ai(i,:) = 0;
q = nzperm(Ai,c+1);
a = A(i,c); % a = i
q = [a+zeros(size(q,1),1) q];
p = [p; q]; %#ok
end
end
Result
>> A=rand(5); A = A.*(rand(size(A))>0.6)
A =
0 0.6468 0.7881 0.5598 0.8008
0.5607 0 0 0 0.8961
0 0 0 0.9394 0.5975
0 0.4756 0.1335 0 0
0 0.3625 0.0216 0 0.9437
>> nzperm(A)
ans =
0.5607 0.6468 0.1335 0.9394 0.9437
0.5607 0.4756 0.7881 0.9394 0.9437
0.5607 0.4756 0.0216 0.5598 0.5975
0.5607 0.4756 0.0216 0.9394 0.8008
0.5607 0.3625 0.1335 0.5598 0.5975
0.5607 0.3625 0.1335 0.9394 0.8008
Note: this code will be slow on large array, since MATLAB make copies of matrix at every step. This algorithm could be implemented without copy using C mex.
5 Kommentare
Siehe auch
Kategorien
Mehr zu Characters and Strings finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!