3D клеточные массивы в Matlab - PullRequest
       0

3D клеточные массивы в Matlab

0 голосов
/ 05 апреля 2011

В настоящее время я работаю с использованием Matlab, я загрузил CSV-файл в массив ячеек с именем B. Теперь я хочу ввести информацию о B в массив трехмерных ячеек, 3-е измерениеиз массива, являющегося первым столбцом B, которые являются строками в диапазоне от "chr1" до "chr24".Полная длина B равна m, а максимальная длина любого "chr" равна maxlength.Я сомневаюсь, что это лучший способ сделать это, но вот мой код:

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

Получаемый из этого трехмерный массив не соответствует соответствующим значениям в исходном массиве.Я также хочу знать, является ли это правильным способом создания трехмерного массива, я не могу найти что-либо о них на веб-сайте Matlab.Спасибо

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Есть несколько возможных проблем с вашим подходом: во-первых, индексация Matlab отличается от индексации в стиле c в таблицы. myCell{i}{j} - это j-й элемент массива ячеек, который содержится в i-м элементе массива ячеек myCell. Если вы хотите индексировать в массив двухмерных ячеек, вы получите содержимое элемента в строке i, столбце j как myCell{i,j}.

Если столбцы 2–9 вашего CSV-файла содержат все числовые данные, может быть гораздо удобнее использовать либо массив 1D-ячеек с записью для каждой хромосомы, либо использовать двумерный или трехмерный числовой массив, если Вы получите для каждой хромосомы одну строку или таблицу соответственно.

Вот один из способов сделать это

%# 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
0 голосов
/ 05 апреля 2011

Мне удалось сделать это только с двумя циклами 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...