简体   繁体   中英

3D cell arrays in matlab

I am currently working using matlab, I have uploaded a csv file into a cell array that I have named B. What I now wish to do is to input the information of B into a 3-D cell array, the 3rd dimension of the array being the first column of B which are strings ranging from "chr1" to "chr24". The full length of B is m, and the maximum length of any "chr" is maxlength. I doubt that this is the best way of going about it but here is my code:

for j = 1:m ,
 Ind = findstr(B{1}{j}, 'chr');
 Num = B{1}{j}(Ind+3:end-1);
 cnum = str2num(Num);
for i = 1:24,
    if cnum == i; 
        for k = 2:9 ,
            for l = 1:maxlength ,

            C{l}{k}{i} = B{k}{j};

            C{l}{k}{i}
            end
         end   
      end
   end
end

The 3-D array that comes out of this does not match the corresponding values in the initial array. I also want to know if this is the right way to create a 3-D array, I can't seem to find anything on the matlab website about them. Thanks

There are a few possible issues with your approach: First of all, Matlab indexing is different from c-style indexing into tables. myCell{i}{j} is the j-th element of the cell array that is contained in the i-th element of the cell array myCell . If you want to index into a 2-d cell array, you would get the contents of the element in row i, column j as myCell{i,j} .

If the columns 2 through 9 of your .csv file contain all numeric data, it may be a lot more convenient to use either a 1D cell array with an entry for every chromosome, or to use a 2D or 3D numeric array if you get, for each chromosome, a single row, or a table, respectively.

Here's one way to do it

%# convert chromosomes to numbers
chromosomes = B{1};
chromosomes = strrep(chromosomes,'X',25);
chromosomes = strrep(chromosomes,'Y',26);
tmp = regexp(chromsomes,'chr(\d+)','tokens','once');
cnum = cellfun(@(x)str2double(x{1}),tmp);

%# catenate the rest of B into a 2D cell array
allNumbers = cell2mat(cat(2,B{2:end}));

%# now we can make a table with [chromosomeNumber,allOtherNumbers]
finalTable = [chromosomeNumber,allNumbers]

%# alternatively, if there are multiple entries for each chromosome, we can
%# group the data in a cell array, so that the i-th entry corresponds to chr.i
%# for readability, use a loop
outputCell = cell(26,1); %# assume 26 chromosomes
for i=1:26
    outputCell{i} = allNumbers(cnum==i,:);
end

I've managed to do this with only two for loops, here is my code:

C = zeros(26,8,maxlength);
next = zeros(1,26);

for j = 1:m ,
 Ind = findstr(B{1}{j}, 'chr');
 Num = B{1}{j}(Ind+3:end-1);
 cnum = str2num(Num);
 if Num == 'X'
 cnum = 25;

 end
 if Num == 'Y'
 cnum = 26;
 end 
 next(cnum) = next(cnum) + 1;
 for k = 2:9 ,


      D{cnum}{k-1}{next(cnum)} = B{k}{j};
      C(cnum,k-1,next(cnum)) = str2num(B{k}{j});


 end   

end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM