matrix 9x9 with duplicate values
7 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
goran
am 19 Jan. 2014
Beantwortet: Harry Commin
am 9 Feb. 2014
i have matrix C9x9 with duplicates. i must find duplicate above main diagonale. when i find first duplicate the searching stop and print this duplicate? thanks
0 Kommentare
Akzeptierte Antwort
goran
am 19 Jan. 2014
2 Kommentare
Mischa Kim
am 19 Jan. 2014
Hello goran, could you please post follow-up questions as comments, not as answers? To your question: the first duplicate above the diagonal (searching from left to right, top to bottom) is the 3 at position (1,2).
Weitere Antworten (5)
Mischa Kim
am 19 Jan. 2014
Bearbeitet: Mischa Kim
am 19 Jan. 2014
This should do. For a 3x3 matrix, as an example:
A = [1 3 2; 4 5 1; 3 1 1]
A_unique = unique(tril(A, -1));
FLAG = false;
for ii = 1:length(A(1,:))
for jj = ii+1:length(A(1,:))
if (length(A_unique) == length(unique([A_unique; A(ii,jj)])))
display(A(ii,jj))
FLAG = true;
break;
end
end
if FLAG
break;
end
end
7 Kommentare
goran
am 19 Jan. 2014
1 Kommentar
Mischa Kim
am 19 Jan. 2014
Bearbeitet: Mischa Kim
am 19 Jan. 2014
Hello goran, the algorithm only searches above the diagonal. That's because of the indexing of the for loop ( jj = ii+1! ):
for ii = 1:length(A(1,:))
for jj = ii+1:length(A(1,:))
You can verify by simply printing the indices of the matrix elements.
goran
am 19 Jan. 2014
1 Kommentar
Mischa Kim
am 19 Jan. 2014
It is. See the display command. Simply run the code above, change the matrix and verify.
Andrei Bobrov
am 19 Jan. 2014
Bearbeitet: Andrei Bobrov
am 20 Jan. 2014
function test1
A = randi(15,3)
B=A;
B(tril(B)>0)=nan;
C=B(~isnan(B));
[a,b] = unique(C,'first');
[~,ii] = sort(b);
c = histc(C,a);
out0 = [a(ii),c(ii)];
out = out0(find(out0(:,2)>1,1,'first'),1);
if isempty(out), disp('no duplicates'); end
end
4 Kommentare
Harry Commin
am 9 Feb. 2014
To extract only the upper triangular numbers into a column vector, you could use:
Aupper = A(triu(ones(size(A)))==1);
I think it is easier to find all duplicates than just the 'first' one. (How do we even define "first"?). However, assuming we want to progress through A column-wise, we could use:
B = unique(Aupper,'stable');
first_duplicate = Aupper(find(Aupper(1:length(B)) ~= B, 1))
The first line finds unique values in the order they appear. The second line finds the first place where the input vector and the 'uniques' are different (i.e. the first duplicate) and prints out that value.
0 Kommentare
Siehe auch
Kategorien
Mehr zu Whos 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!