【问题标题】:Simplify a Matlab code involving finding the position of maximum elements of array简化涉及查找数组最大元素位置的 Matlab 代码
【发布时间】:2019-12-28 00:00:08
【问题描述】:

我希望您能帮助提高(也许通过矢量化)下面的 Matlab 代码的效率。下面的代码基本上做了以下事情:取一个行向量A;考虑这样一个行向量的最大元素,例如,让ij 他们的位置;构造两个列向量,第一个全为零,但1 位于i,第二个全零但1 位于j

这是我对循环的尝试,但它看起来比需要的要复杂。

clear
rng default
A=[3 2 3];
max_idx=ismember(A,max(A));
vertex=cell(size(A,2),1);
for j=1:size(max_idx,2)
    if max_idx(j)>0
       position=find(max_idx(j));
       vertex_temp=zeros(size(A,2),1);
       vertex_temp(position)=1;
       vertex{j}=vertex_temp;
    else
       vertex{j}=[];
    end
end
vertex=vertex(~cellfun('isempty',vertex)); 

【问题讨论】:

  • find(max_idx(j)) 在您的代码中始终返回 1。你只需要position=j

标签: matlab


【解决方案1】:

仍然使用for 循环,但更具可读性:

A = [3 2 3];

% find max indices
max_idx = find(A == max(A));
vertex = cell(numel(max_idx),1);

for k = 1:numel(max_idx)
    vertex{k} = zeros(size(A,2),1);   % init zeros
    vertex{k}(max_idx(k)) = 1;        % set value in vector to 1
end

【讨论】:

    【解决方案2】:

    如果你真的想避免 for 循环,你也可以使用这样的东西:

    A=[3 2 3];
    
    max_idx = find(A==max(A));
    outMat = zeros(numel(A), numel(max_idx));
    
    outMat((0:(numel(max_idx)-1)) * numel(A) + max_idx) = 1;
    

    如果您希望它们在单独的单元格中而不是矩阵的列中,则可以选择:

    outCell = mat2cell(outMat, numel(A), ones(1,numel(max_idx)))';
    

    但是,我认为这可能不如现有答案简单易读。

    【讨论】:

      【解决方案3】:

      您需要元胞数组而不是矩阵是否有特定原因?

      如果你可以把所有东西都放在一个向量中:

      A = [3 2 3] 
      B_rowvec = A == max(A)
      B_colvec = B_rowvec'
      

      如果您需要将它们分成单独的向量:

      A = [3 2 3]
      Nmaxval = sum(A==max(A))
      outmat = zeros(length(A),Nmaxval)
      for i = 1:Nmaxval
          outmat(find(A==max(A),i),i)=1;
      end
      outvec1 = outmat(:,1)
      outvec2 = outmat(:,2)
      

      基本上,find 的第二个输入将指定您想要的第一个输入的哪个令人满意的实例。

      所以

      example = [ 1 2 3 1 2 3 1 2 3 ] 
      first = find(example == 1, 1) % returns 1
      second = find(example == 1, 2) % returns 4
      third = find(example == 1, 3) % returns 7
      

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 2023-03-26
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多