2011-04-05 140 views
0

我目前正在使用matlab,我已经上传了一个csv文件到我已经命名为B的单元格数组中。我现在想要做的是将B的信息输入到一个3-D单元数组的第三维是B的第一列,它们是从“chr1”到“chr24”的字符串。 B的全长为m,任何“chr”的最大长度为maxlength。我怀疑这是要去关于它的最好方式,但这里是我的代码:matlab中的三维单元阵列

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 

散发出来的这种初始数组中不匹配的相应值的3-d阵列。我也想知道如果这是创建3D阵列的正确方法,我似乎无法在matlab网站上找到关于它们的任何内容。 感谢

+0

是数据数字其余的一种方式? – Jonas 2011-04-05 14:02:39

+0

是的,我发布的以下代码将其放入三维单元阵列和三维矩阵中。 – Tim 2011-04-05 15:47:11

回答

0

我设法只有两个for循环要做到这一点,这里是我的代码:

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 
1

有你的方法的几个可能的问题:首先,Matlab的索引是从不同C风格索引到表中。 myCell{i}{j}是包含在单元阵列第i个元素myCell中的单元阵列的第j个元素。如果你想索引到一个2-D单元格数组,你会得到第i行第j列元素的内容,如myCell{i,j}

如果.csv文件的第2到第9列包含所有数字数据,则可以更方便地为每个染色体使用带有条目的1D单元格阵列,或者使用2D或3D数组数组如果您分别为每个染色体获取单个行或一个表。

这里做

%# 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