Сегмент кода, над которым я работаю, приведен ниже:
NphaseSteps = 6;
phases = exp( 2*pi*1i * (0:(NphaseSteps-1))/NphaseSteps );
i = 1;
while i <= 10 %number of iterations
ind = randi([1 NphaseSteps],10,10);
inField{i} = phases(ind);
save('inField.mat', 'inField')
i = i + 1;
end
Теперь мне нужно отследить эти случайно созданные матрицы "inField {i}" и исключить те, которыеравны друг другу.Я знаю, что могу использовать условие «если», но поскольку я новичок в программировании, я не знаю, как использовать его более эффективно, чтобы это не занимало слишком много времени.Итак, мне нужна ваша помощь для быстрой работающей программы, которая делает эту работу.Заранее спасибо.
Мой фактический сегмент кода (после внесения изменений, предложенных @bisherbas), следующий.Обратите внимание, что я на самом деле хочу использовать переменную "inField" внутри цикла для каждой случайно созданной матрицы, и цикл продвигается, только если результат удовлетворяет определенному условию.Итак, я думаю, что ответ, данный @bisherbas, на самом деле не устраняет равные матрицы inField до , которые они используются в расчете.Это, конечно, моя ошибка, так как я не объявлял об этом в начале.
NphaseSteps = 6;
phases = exp( 2*pi*1i * (0:(NphaseSteps-1))/NphaseSteps );
nIterations = 5;
inField = cell(1,nIterations);
i = 1;
j = 1;
while i <= nIterations % number of iterations
ind = randi([1 NphaseSteps],TMsize,TMsize);
tmp = phases(ind);
idx = cellfun(@(x) isequal(x,tmp),inField);
if ~any(idx)
inField{i} = tmp;
end
j = j+1;
outField{i} = TM * inField{i};
outI = abs(outField{i}).^2;
targetIafter{i} = abs(outField{i}(focusX,focusY)).^2;
middleI = targetIafter{i} / 2;
if (max(max(outI)) == targetIafter{i})...
&& ( sum(sum((outI > middleI).*(outI < max(max(outI))))) == 0 )
save('inFieldA.mat', 'inField')
i = i + 1;
end
if mod(j-1,10^6) == 0
fprintf('The number of random matrices tried is: %d million \n',(j-1)/10^6)
end
end
Кроме того, я написал длинное выражение для моего условия цикла:
if (max(max(outI)) == targetIafter{i})...
&& ( sum(sum((outI > middleI).*(outI < max(max(outI))))) == 0 )
save('inFieldA.mat', 'inField')
i = i + 1;
end
Здесь я хочу максимальный элемент в некоторой точке (focusX, focusY) в матрице outField.Таким образом, первое условие решает, имеет ли точка фокусировки максимальный элемент для матрицы.Но я также хочу, чтобы все остальные элементы были меньше определенного числа (middleI), и поэтому пишется вторая часть условия if.Тем не менее, мне не очень удобно с этим вторым условием, и я открыт для любой помощи.