How to find a value in a list?
조회 수: 61 (최근 30일)
이전 댓글 표시
I have a m-by-3 matrix of numbers (as below) and I would like to find a specific number in a row and then find the other numbers in that same row then write these in a seperate matrix. For example I want to look for the numbers connected to the number 4, in row 1 these will be 15 and 12 and in row 15 these will be 12 and 3. I then want a matrix called 4 to contain the values 15, 12 and 3. I do not want any repeats in this new matrix, hence 12 only appears once in the new matrix.
15 4 12
5 7 2
22 23 21
18 11 10
10 8 14
16 12 11
12 3 6
8 7 5
8 5 9
14 8 9
7 1 2
5 13 9
5 2 13
7 6 1
12 4 3
댓글 수: 6
Matt Fig
2012년 8월 15일
Questions:
Do you want all of the numbers in a row that has the given number in it, or just those connected to it (adjacent neighbors)? Take the number 15 in your given list. Do you want to include both the 4 and the 12 from row 1 or just the 4?
What if we had a row like this:
4 4 6
Would we count 4 as a neighbor to 4 (Andrei's code will not)?
Will the real array you need to work with have numbers only on [1,23] or what range?
Thanks.
답변 (4개)
Ilham Hardy
2012년 8월 15일
Unchecked..
test_val = [15 4 12;5 7 2;22 23 21;18 11 10;10 8 14;16 12 11;12 3 6;8 7 5;8 5 9;14 8 9;7 1 2;5 13 9;5 2 13;7 6 1;12 4 3];
base_num = 4;
[r4 c4] = find(test_val==base_num);
matrx4 = unique(test_val(r4,:));
matrx4(matrx4==base_num)=[];
HTH, IH
댓글 수: 0
Andrei Bobrov
2012년 8월 15일
편집: Andrei Bobrov
2012년 8월 16일
z = [...
15 4 12
5 7 2
22 23 21
18 11 10
10 8 14
16 12 11
12 3 6
8 7 5
8 5 9
14 8 9
7 1 2
5 13 9
5 2 13
7 6 1
12 4 3];
out = setdiff(unique(z(any(z == 4,2),:)),4);
ADD ( EDIT )
c = unique(z);
n = numel(c);
out = cell(1,n);
for j1 = 1:n
out{j1} = unique(z(conv2(+(z==c(j1)),[1 0 1],'same')>0));
end
댓글 수: 0
Jordan
2012년 8월 15일
댓글 수: 4
Andrei Bobrov
2012년 8월 16일
Hi Jordan! Please use:
c = unique(z);
n = numel(c);
out = cell(1,n);
for j1 = 1:n
out{j1} = unique(z(conv2(+(z==c(j1)),[1 0 1],'same')>0));
end
Matt Fig
2012년 8월 16일
For large data sets, this is the fastest I could come up with:
A = ceil(rand(19e4,3)*255); % Large data set on [1 255]
% Begin Code, store results in cell array T.
m = max(A(:));
T = cell(1,m);
for ii = 1:m
T{ii} = A(any(A==ii,2),:);
T{ii} = sort(T{ii}(:).');
T{ii} = T{ii}([~isempty(T{ii}) diff(T{ii})~=0]);
T{ii} = T{ii}(T{ii}~=ii);
end
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Large Files and Big Data에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!