Как избежать цикла в Matlab при построении новой матрицы из базы данных

У меня есть матрица с двумя столбцами с примерно 500 строк. Значения первого столбца меняются от 1 до 48. Это означает, что в первом столбце повторяются числа. Мне нужно сделать, чтобы построить новую матрицу с 48 строками, каждая строка содержит информацию для определенного номера в столбце 1. Например, рассмотрим следующие данные:

x = [ 3 500
5 400
3 200
1 100
1 1100 
2 450 
3 890
1 110
2 800
....]

Итак, исходная матрица должна быть:

Output = [100 1100 110 ...0 0 0; 450 800 ... 0 0 0; 8200 890 0 0 0 ...; 0 0 0];

Я знаю, как это сделать, используя цикл, но мне нужно сделать это без цикла for.

Я использовал следующие строки

XX = X(:,2);

Output = XX(X(:,1)==(1:48)');

Но это не сработало, потому что количество строк в новой матрице не то же самое.

Любая помощь приветствуется.

Всего 1 ответ


Вы можете сделать это с помощью функции sub2ind, я рекомендую прочитать документацию, чтобы понять, как это работает. Мы поместим все значения x (:, 2) в матрицу M. Строка, к которой принадлежит каждое значение, зависит от значений x (:, 1), поэтому мы должны определить, в каком столбце принадлежит значение.

Ниже j вычисляется так, что j (k) равно числу раз x (k, 1) в векторе x (1: k, 1). Это будет столбец, в который мы хотим поместить значение x (k, 2) в.

x = [ 3 500
5 400
3 200
1 100
1 1100 
2 450 
3 890
1 110
2 800];

j = sum(triu(x(:,1)==x(:,1)'));     % Calculate the column each value should be placed into
M = zeros(max(x(:,1)), max(j));   % Set up the empty matrix
ind = sub2ind(size(M), x(:,1), j(:)); % Get linear indices from subscripts
M(ind) = x(:,2)

M =

     100        1100         110
     450         800           0
     500         200         890
       0           0           0
     400           0           0

Есть идеи?

10000