MATLAB —如何消除在循环内部随机创建的相等矩阵?

时间:2018-09-22 13:45:56

标签: matlab loops matrix random equality

我正在处理的代码段如下:

 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}”,并消除彼此相等的矩阵。我知道我可以使用“ if”条件,但是由于我是编程新手,所以我不知道如何更有效地使用它,从而不会花费太多时间。因此,我需要您的帮助,以帮助您快速完成工作。预先感谢。


我的实际代码段(在完成@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

在这里,我需要outField矩阵中某个点(focusX,focusY)的最大元素。因此,第一个条件决定焦点是否具有矩阵的最大元素。但是我还希望所有其他元素都小于一个特定的数字(middleI),这就是为什么编写if条件的第二部分的原因。但是,我对这第二种情况不太满意,并且愿意接受任何帮助。

1 个答案:

答案 0 :(得分:1)

尝试一下:

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