2011-04-05 169 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