MATLAB - Как устранить равные матрицы, которые случайно создаются внутри цикла? - PullRequest
0 голосов
/ 22 сентября 2018

Сегмент кода, над которым я работаю, приведен ниже:

 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.Тем не менее, мне не очень удобно с этим вторым условием, и я открыт для любой помощи.

1 Ответ

0 голосов
/ 22 сентября 2018

Попробуйте:

NphaseSteps = 6;
phases = exp( 2*pi*1i * (0:(NphaseSteps-1))/NphaseSteps );
i = 1;
inField = cell(1,NphaseSteps);
while i <= NphaseSteps  %number of iterations
    ind = randi([1 NphaseSteps],NphaseSteps,NphaseSteps);
    tmp = phases(ind);
    idx = cellfun(@(x) isequal(x,tmp),inField);
    if ~any(idx)
        inField{i} = tmp;
    end
    save('inField.mat', 'inField')
    i = i + 1;
end

Подробнее о cellfun здесь:

https://www.mathworks.com/help/matlab/ref/cellfun.html

...