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