Что вам нужно сделать, это вместо того, чтобы хранить значения, которые меньше или больше c35p
в lessnum
и greaternum
, соответственно, вы должны хранить индексы этих чисел. Таким образом, вы можете напрямую получить доступ к переменной newC
, используя эти индексы, а затем умножить свои линейно сгенерированные значения.
Дальнейшие изменения описаны в самом коде. Если у вас есть путаница, вы можете прочитать справку для unique
Вот модифицированный код (я предполагаю, что cc
- одномерный массив)
%randomly generate a cc vector
cc = randi(100, 1, 10);
% modified code below
[uniquec, ~, induniquec]=unique(cc, 'sorted'); % modified to explicitly specify the inbuilt sorting capability of unique and generate the indicies of unique values in the array
maxc=max(uniquec);
c35p=0.35*maxc;
lessnum=uniquec<=c35p; % instead of lessnum=uniquec(uniquec<=c35p);
greaternum=uniquec>c35p; % instead of greaternum=uniquec(uniquec>c35p);
gl=linspace(1,2,sum(lessnum));
gr=linspace(2,1,sum(greaternum));
% now there is no need for 'for' loops. We first modify the unique values as specified and then regenerate the required matrix using the indices obtained previously
newC=uniquec;
newC(lessnum) = newC(lessnum) .* gl;
newC(greaternum) = newC(greaternum) .* gr;
newC = newC(induniquec);
Этот новый код будет работать намного быстрее, чем исходный, но он потребляет гораздо больше памяти в зависимости от количества уникальных значений в исходном массиве.