我正在处理的代码段如下:
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条件的第二部分的原因。但是,我对这第二种情况不太满意,并且愿意接受任何帮助。
答案 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
上了解更多信息: