0

I am a Matlab beginner, as will soon be very obvious. I am trying to assemble an cell array that has a single column of filenames.

I have multiple sessions. Each session should have 56 filenames (but some could be short or long, so I'd honestly prefer a solution that wouldn't break on encountering a short session). I need to loop over sessions and append the names in each subsequent session to my cell array, so that after two sessions the dimensions are 112, 1.

In other words, I'd like an array that went:

P =

/data/session1/dvol1.img
/data/session1/dvol2.img
...
/data/session1/dvol56.img
/data/session2/dvol1.img
/data/session2/dvol2.img
...
/data/session2/dvol56.img

and so on if there are more than two sessions.

The function I have that finds the filenames in the session is spm_select. It returns a char array of all the files in a directory that match a regular expression, in this case, 56 files for each session directory.

(I recognize my question is very similar to the question here: Using loops to get multiple values into a cell but I couldn't figure out an answer to my question since that person is only trying to append a single value at a time.)

I have tried a lot of things that haven't worked.

This:

data_path = '/foo/bar/';
subjects = {'test1'};
sessions = {'session1' 'session2' };
for i=1:numel(subjects)
    clear P
    P=cell(56*numel(sessions),1); 
    for j=1:numel(sessions)
        P{(j-1)*56+1} = spm_select('FPList', fullfile(data_path,subjects{i}, sessions{j}), '^d.*\.img$');
    end   
end

generated a cell array that was 112x1, but had a first element that was 56x57 char array, that is, the filenames of all files in my first session directory, and none of them from the second.

I'm not sure how useful it would be to recapitulate every wrong-headed thing I've done, so I won't.

Thanks in advance for your help.

Editing to include sample output from spm_select by request:

>> output = spm_select('FPList', fullfile(data_path,subjects{i}, sessions{j}), '^d.*\.img$')

output =

/home/katie/Desktop/sample/test1/run_1L3/draghf000001.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000035.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000069.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000103.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000137.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000171.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000205.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000239.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000273.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000307.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000341.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000375.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000409.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000443.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000477.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000511.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000545.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000579.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000613.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000647.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000681.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000715.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000749.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000783.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000817.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000851.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000885.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000919.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000953.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000987.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001021.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001055.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001089.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001123.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001157.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001191.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001225.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001259.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001293.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001327.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001361.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001395.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001429.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001463.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001497.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001531.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001565.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001599.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001633.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001667.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001701.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001735.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001769.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001803.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001837.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001871.img

>> class(output)

ans =

char

>> size(output)

ans =

    56    57

>> 

Edit: Ok, problem solved. Here is the code I eventually used:

data_path = '/foo/bar';
subjects = {'test1'};
sessions = {'session1' 'session2' };

output={};
for i=1:numel(subjects)
    for j=1:numel(sessions)
        files=spm_select('FPList', fullfile(data_path,subjects{i},sessions{j}), '^d.*\.img$')
        f_c=cellstr(files);
        output=vertcat(output,f_c);
    end
end

I think the answer to how "do you get a char array to append to a column cell array vertically" is convert it to a cell array and use vertcat.

Community
  • 1
  • 1
Katie
  • 808
  • 1
  • 11
  • 28
  • Does your `spm_select` really return a char array, or a cell array of strings? (file names may have different lenghts). Can you edit the question to post an example of `spm_select`'s output? – Luis Mendo Jul 12 '14 at 00:08
  • If all you want is: the filenames in all the `sessions` folder. Then [this](http://stackoverflow.com/a/2654459/1586200) will work for you. Call it as `fileList = getAllFiles(data_path);` – Autonomous Jul 12 '14 at 00:16
  • Thanks Luis, I did so. Parag, I I don't want all the filenames. I only want the ones that match the regular expression. – Katie Jul 12 '14 at 00:20
  • 1. In your `spm_select` function, where is the mention of regular expression? 2. Why do you write `P{(j-1)*56+1}` where `j` takes on only two values: {1,2}. 3. How can you get a `112x1` cell array? Put `j=2` and you get 57, so you can get at most 57-element long cell array. Can you do `whos P` and paste the output here? – Autonomous Jul 12 '14 at 00:37
  • 1) is regular expression not the term for this: '^d.*\.img$'? Sorry if I'm not using the right words 2) I'm not defending the logic of that. I thought maybe Matlab would stick the array in the first slot I named. I honestly was just giving it as an example of something I've tried. I did try something that made more sense to me: P{(j-1)*56+1:j*56} `The right hand side of this assignment has too few values to satisfy the left hand side. Error in arr (line 8) P{(j-1)*56+1:j*56} = spm_select('FPList', fullfile(data_path,subjects{i}, sessions{j}), '^d.*\.img$');` – Katie Jul 12 '14 at 11:20
  • 3) This is whos P after the original code snippet:`>> whos P Name Size Bytes Class Attributes P 112x1 5584 cell ` – Katie Jul 12 '14 at 11:23
  • Interestingly, before, when I was running this on my Linux machine, when I ran it one 56x57 char array appended to the first cell of the 112x1 cell array. Now at home on my Windows computer it appends one array in the first slot and one in the 57th, which makes more sense. I don't know what I was doing differently before. @Parag – Katie Jul 12 '14 at 11:34
  • @Katie Yes, it is a regular expression, I didn't see it, my mistake. Anyway, could you decode the regular expression for me in words. For example,I think, you want those paths, "which do not start from d AND the path should end in "img". Am I correct? – Autonomous Jul 12 '14 at 16:58
  • @Katie I think you should use `fileList = getAllFiles(data_path);` to get list of all the files, then use [this](http://www.mathworks.com/help/matlab/ref/regexp.html) function to filter out the unwanted ones. If it works, you can then consider modifying the `getAllFiles` function. – Autonomous Jul 12 '14 at 17:01

1 Answers1

0

You can try this code:

function output=file_list(path)
output={};
subjects=dir(path);
for a=3:length(subjects)
    sessions=dir(fullfile(path,subjects(a).name));
    for b=3:length(sessions)
        files=dir(fullfile(path,subjects(a).name,'/',sessions(b).name,'/*.img'));
        f_c=struct2cell(files);
        f=f_c(1,:)';
      output=vertcat(output,fullfile(path,subjects(a).name,'/',sessions(b).name,'/',f));
    end
end

One drawback of this code is that the size of output grows inside the loop. Here is an example:

path='/home/naveen/Desktop/example/'; % path is the main directory in which the data of 
                                      % subjects is stored in sub directories. 
output=file_list(path)

The output is:

output = 

    '/home/naveen/Desktop/example/subject_1/session_1/lipo2.png'
    '/home/naveen/Desktop/example/subject_1/session_1/lipo_6.png'
    '/home/naveen/Desktop/example/subject_1/session_1/lps_4.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_2.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_2_1.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_2_3.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_4.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_6.png'
    '/home/naveen/Desktop/example/subject_2/session_1/lipo2.png'
    '/home/naveen/Desktop/example/subject_2/session_1/lipo_6.png'
    '/home/naveen/Desktop/example/subject_2/session_1/lps_4.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_2.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_2_1.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_2_3.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_4.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_6.png'

Hope this works for you. Please note that in the inner most for loop you have to change the file extension while using for your purpose.

Naveen
  • 306
  • 1
  • 6
  • Thank you, @Naveen. This works to get all the files in the folder, but not to select the files that begin with d. I also have other directories in the subject dir besides the ones I want to reference. Also, I should have made this more explicit, but it's important to me to learn to manipulate the output of spm_select. I'm not getting away from it. I'm trying to work on a solution that converts the output of spm_select into a cell array inside the loop and uses vertcat, but I haven't yet found it. Ihave to step away from the computer, but I'll let you know if I figure it out. – Katie Jul 12 '14 at 12:40
  • I used elements of your answer when I eventually solved the problem. Thanks very much -- I didn't know the command "vertcat." – Katie Jul 12 '14 at 18:38