2016-09-01 7 views
1

Предположим, у меня есть ячейка под названием data с тремя элементами. Каждый элемент ячейки содержит матрицу (n x 2). Первый столбец каждой ячейки в data является идентификатором данных рядом с ним, а второй столбец - фактическими данными. Обратите внимание, что фактический data, с которым я работаю, не состоит из rand номеров, но это конкретные конкретные цифры.Как переставить содержимое ячеек в одну матрицу в Matlab

data = cell(1,3); 

data{1} = [1 rand ; 
      2 rand ; 
      3 rand ; 
      4 rand]; 

data{2} = [2 rand ; 
      3 rand ; 
      4 rand ; 
      5 rand ; 
      6 rand]; 

data{3} = [2 rand ; 
      5 rand ; 
      6 rand ; 
      7 rand ; 
      8 rand ; 
      9 rand]; 

Я хочу изменить содержимое data в матрицу под названием rearrange, как показано ниже. Как вы можете видеть, ID 1 существует только в data{1}, поэтому rand считается равным нулю в третьем и четвертом столбцах первой строки в rearrange. Как вы можете видеть, ID 9 существует только в data{3}, поэтому rand считается равным нулю во втором и третьем столбцах девятой строки в rearrange.

rearrange = [1 rand 0 0 ; 
      2 rand rand rand ; 
      3 rand rand 0 ; 
      4 rand rand 0 ; 
      5 rand rand rand ; 
      6 0 rand rand ; 
      7 0 0 0 ; 
      8 0 0 rand ; 
      9 0 0 rand]; 

В этом случае уникальные идентификаторы 1:9, но я хочу, чтобы автоматизировать список уникальных идентификаторов, а не просто сказать 1:9.

+0

Возможного дубликат [Регистрации матриц в MATLAB] (HTTP: // StackOverflow. com/questions/10981570/join-matrices-in-matlab) – beaker

+0

сторона примечание, 'rebrange' - встроенная функция matlab, поэтому не следует использовать как имя переменной, если возможно – Trogdor

+0

@Trogdor Я думаю, что я могу использовать более старую версия, где 'resrange', похоже, не существует (2015a). В следующий раз я буду осторожен. – Senyokbalgul

ответ

1

Это может быть сделано с помощью for петли довольно легко:

CellData = data; 
for n = 1:length(CellData) %loop through each cell 
    indices = CellData{n}(:,1); %extract indices 
    values = CellData{n}(:,2); % extract values 
    Matrix(indices, n) = values; %assign values to correct location 
end 
% add the first column in 
sMatrix = size(Matrix); 
counter = 1:sMatrix(1); 
finalMatrix = [counter' Matrix]; 
+0

Спасибо за простое решение – Senyokbalgul

1

вы можете использовать цикл:

for i = 1: length(data) 
    rearrange(data{i}(:,1),i+1) = data{i}(:,2); 
end 
rearrange(:,1) = 1:size(rearrange,1); 
+0

хорошее решение, хотя я бы рекомендовал предварительно распределить ваш окончательный массив – Trogdor

+0

@ rahnema1 Спасибо за помощь. – Senyokbalgul

+0

@Trogdor OK, но для этого требуется еще один шаг для вычисления максимального числа идентификаторов, поэтому ответ может казаться более сложным. Вы можете добавить предопределение к вашему ответу – rahnema1

 Смежные вопросы

  • Нет связанных вопросов^_^