Ответ 1
То, что такое индикаторная матрица, так это лучше, если вы сделаете ее разреженной. В любом случае вы почти всегда будете делать матрицу с умножением, поэтому сделайте это умножением на эффективный.
n = 4;
V = [3;2;1;4];
M = sparse(V,1:n,1,n,n);
M =
(3,1) 1
(2,2) 1
(1,3) 1
(4,4) 1
Если вы настаиваете на том, что M является полной матрицей, то сделать это так просто после факта, используя полный.
full(M)
ans =
0 0 1 0
0 1 0 0
1 0 0 0
0 0 0 1
Узнайте, как использовать разреженные матрицы. Вы выиграете от этого. По общему признанию, для матрицы 4x4 редкость не будет выигрыша. Но примерные случаи никогда не являются вашей истинной проблемой. Предположим, что n действительно 2000?
n = 2000;
V = randperm(n);
M = sparse(V,1:n,1,n,n);
FM = full(M);
whos FM M
Name Size Bytes Class Attributes
FM 2000x2000 32000000 double
M 2000x2000 48008 double sparse
Разреженные матрицы не получаются только с точки зрения используемой памяти. Сравните время, необходимое для размножения одной матрицы.
A = magic(2000);
tic,B = A*M;toc
Elapsed time is 0.012803 seconds.
tic,B = A*FM;toc
Elapsed time is 0.560671 seconds.