필터 지우기
필터 지우기

Find indices in cell array

조회 수: 8 (최근 30일)
Timo
Timo 2017년 10월 25일
댓글: Timo 2017년 10월 28일
Hello everybody,
I have some problems to get the indices of a certain value, in this case -1, within a cell array. The structure of the cell array is like this: A is a 27x1 cell where each of the 27 rows has 500000 cell entries (numeric values between -1 and 999). What I want are the indices where the value -1 occurs, since I have to replace them afterwards. For example A{1,1}{4,1} or A{24,1}{95423,1} are containing the value -1. First of all I tried index=cellfun(@(x) x==-1, A{1,1}, 'Uniform', false) and then I used index2=cellfun(@(x) x==-1, A{2,1}, 'Uniform', false) and so on (. So I could get the information separately but I think there should exist a solution where I don't have to define 27 index cell arrays. Hopefully someone can help and recommend a more meaningful solution. I used the search function but none of the solutions in similar topics did work for my case (using cellfun(@(x) find(x==-1), A{1,1}, 'UniformOutput',false) leads to the same approach like I did it already for example).
Thanks in advance :)

답변 (3개)

Andrei Bobrov
Andrei Bobrov 2017년 10월 25일
Aw = cellfun(@(x)[x{:}]',A,'un',0);
Aw = [Aw{:}];
[ii,jj] = find(Aw == -1) ;
out = [jj,ii];
  댓글 수: 7
Stephen23
Stephen23 2017년 10월 27일
편집: Stephen23 2017년 10월 27일
@Timo: always store data in the simplest array-class possible. It is up to you to decide where that boundary is. A good rule of thumb is to start with simple numeric arrays, and only change to a more complex data class when it proves necessary to do so.
Timo
Timo 2017년 10월 27일
Yes, you are absolutely right, I thought it is more clearly arranged, when a file for example consists of 100 stations and 100 time series since I need to write a text file for each of them. Hopefully it works soon :). Thank you!

댓글을 달려면 로그인하십시오.


Jos (10584)
Jos (10584) 2017년 10월 25일
A = {[-1 0 0 -1],1:4,[1 -1 1 -1 1 -1]} % example array
fhFind = @(x) find(x == -1) ;
IDX = cellfun(fhFind ,A,'un',0)

Jan
Jan 2017년 10월 25일
편집: Jan 2017년 10월 25일
After the data are converted to a numerical array, the processing is very efficient. Consider, if it would be better to store the data as numerical array directly instead of the complicated nested cell.
If you really need the cells, and want to replace the -1 only, it might be better to avoid the conversion to one huge numerical array:
for iA = 1:numel(A)
B = A{iA};
for iB = 1:numel(B)
C = B{iB};
C(C == -1) = 42;
B{iB} = C;
end
end
This is not nice, but it is worth to try if it is faster.
  댓글 수: 7
Jan
Jan 2017년 10월 28일
@Tima: You have set all values of the output to {-99} in this line already:
union{i,1}(:,2)={-99};
and later crop of all other information:
union2{i,1}=union{i,1}(:,2);
Therefore it is not clear to me, what you want to achieve.
Timo
Timo 2017년 10월 28일
I wanted to give all dates of the reference time series that were not observed in the certain station a value of -99. Afterwards I wanted to give the dates which contain measurements the corresponding values. And in a third step I wanted to replace the dates that contain a value of -1 also with a value of -99. Now I was trying to follow your recommendation to work with normal arrays, what really seems to simplify everything a lot until now :)!

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by