cell contents in a loop_fangjun's answer

Hello all, I have a vars = cell(1,9) like following, the code works fine when there is a single row.
vars = {'OKR_evapo','MDF_albedo','HDU_wind','GDf_temp','MPGF_humidity', 'MDF_pressure','YKK_temperature','XRYO_rain','MPIO_radiation'};
files={'myd_11_MDF_albedo_a54576' 'mod_19_GDf_temp_vhk464567' 'mcd_13_MPGF_humidity.sdjfg590856' 'myd_11_MDF_pressure_46358' 'cyd_11_YKK_temperature_a54576' 'dod_13_XRYO_rain_vhk464567' 'ecd_11_MPIO_radiation.sdjfg590856'};
Index=false(size(vars));
for k=1:length(vars)
for j=1:length(files)
if strfind(files{j},vars{k})
Index(k)=true;
break;
end
end
end
How can I read all the rows in a loop if I have data/filenames in cell(10,9) instead of the single row. There are multiple rows in a cell of size 10*9. I should get a matrix of size 10*9 containing 1 and 0s.

댓글 수: 2

Oleg Komarov
Oleg Komarov 2011년 8월 15일
Please format the code: http://www.mathworks.com/matlabcentral/answers/13205-tutorial-how-to-format-your-question-with-markup#answer_18099
Fangjun Jiang
Fangjun Jiang 2011년 8월 15일
Why do you ask the same question in two different places?

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

 채택된 답변

Fangjun Jiang
Fangjun Jiang 2011년 8월 15일

1 개 추천

You need to change the last part of the code as below.
Index=false(size(files));
for j=1:size(files,1)
for k=1:size(files,2)
for n=1:length(vars)
if strfind(files{j,k},vars{n})
Index(j,k)=true;
break;
end
end
end
end
Or looping this way to guess what is expected.
vars = {'ind' 'ger' 'us' 'swis' 'kor' 'ch'};
files = {'india' ,'germany','usa' ,'korea','','';...
'germany','usa' ,'china','' ,'','';...
'usa' ,'swiss' ,'china','' ,'',''};
N_row=size(files,1);
N_col=size(vars,2);
Index=false(N_row,N_col);
for j=1:N_row
for k=1:N_col
for n=1:size(files,2)
if strfind(files{j,n},vars{k})
Index(j,k)=true;
break;
end
end
end
end
Index =
1 1 1 0 1 0
0 1 1 0 0 1
0 0 1 1 0 1

추가 답변 (3개)

Oleg Komarov
Oleg Komarov 2011년 8월 15일

1 개 추천

vars = {'ind' 'ger' 'us' 'swis' 'kor' 'ch'};
files = {'india' ,'germany','usa' ,'korea','','';...
'germany','usa' ,'china','' ,'','';...
'usa' ,'swiss' ,'china','' ,'',''};
szF = size(files);
Index = false(szF);
for n = 1:numel(vars)
[r,c] = find(~cellfun('isempty',strfind(files,vars{n})));
c(:) = n;
Index(sub2ind(szF,r,c)) = true;
end
Jan
Jan 2011년 8월 15일

0 개 추천

Replace "for k=1:length(vars)" by "for k=1:numel(vars)".
YOGESH
YOGESH 2011년 8월 15일

0 개 추천

Thanks. but it seems that it is not doing well. e.g. I created a cell (of size (3,6) like
vars = {'ind' 'ger' 'us' 'swis' 'kor' 'ch'};
files = cell([{'india'},{'germany'},{'usa'},{'korea'},{''},{''};...
{'germany'},{'usa'},{'china'},{''},{''},{''};...
{'usa'},{'swiss'},{'china'},{''},{''},{''}]);
If I run the code, I should get
Index = [ 1 1 1 0 1 0;
0 1 1 0 0 1;
0 0 1 1 0 1 ]
all I am getting is like
[ 1 1 1 1 0 0; 1 1 1 0 0 0; 1 1 1 0 0 0]
@Oleg, thanks for the formating tutorial. cheers

댓글 수: 7

Fangjun Jiang
Fangjun Jiang 2011년 8월 15일
Check again. The result from the code is correct!
Oleg Komarov
Oleg Komarov 2011년 8월 15일
No, he want to run strfind(vars,files).
Fangjun Jiang
Fangjun Jiang 2011년 8월 15일
@Oleg, in your solution, you also used strfind(files,vars)?!
Oleg Komarov
Oleg Komarov 2011년 8월 15일
Yes because there's no way to find a longer string in a shorter. To emulate the effect of strfind(vars,files) I adjust the column position to n.
Fangjun Jiang
Fangjun Jiang 2011년 8월 15일
No. The issue is not that! The issue is who the logical index should be corresponding to! From all his description and example, I thought the index should be corresponding to the long strings in the variable "files". For any one of the long strings in the variable "files", if any of the short strings is found, the corresponding logical index should be true!
But apparently NOT! What he wants is a logical index with the same number of rows as "files" but same columns as "vars".
Fangjun Jiang
Fangjun Jiang 2011년 8월 15일
To be honest, the OP's description and examples are not clear or even mis-leading. Anyway, I added another version which created the results expected. It is a tedious for-loop with strfind(). That's all.
Oleg Komarov
Oleg Komarov 2011년 8월 15일
@Fangjun: well, you're rigth about the confusion. In fact my solution works for the specific example just because files is padded with empty strings.
I guess it won't be difficult to preallocate Index with m from files and n from vars.

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

카테고리

도움말 센터File Exchange에서 Data Preprocessing에 대해 자세히 알아보기

질문:

2011년 8월 15일

Community Treasure Hunt

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

Start Hunting!

Translated by