【问题标题】:Delete values between specific ranges of indices in an array删除数组中特定索引范围之间的值
【发布时间】:2016-09-11 00:57:17
【问题描述】:

我有一个数组:

Z = [1 24 3 4 52 66 77 8 21 100 101 120 155];

我还有另一个数组:

deletevaluesatindex=[1 3; 6 7;10 12]

我想删除数组Z 在数组deletevaluesatindex 中表示的索引(1 到 3、6 到 7、10 到 12)处的值

所以Z的结果是:

Z=[4 52 8 21 155];

我尝试使用下面的表达式,但它不起作用:

X([deletevaluesatindex])=[]

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    使用bsxfuncumsum 的另一种解决方案:

    %// create index matrix
    idx = bsxfun(@plus , deletevaluesatindex.', [0; 1])
    %// create mask
    mask = zeros(numel(Z),1);
    mask(idx(:)) = (-1).^(0:numel(idx)-1)
    %// extract unmasked elements
    out = Z(~cumsum(mask))
    

    out =    4    52     8    21   155
    

    【讨论】:

      【解决方案2】:

      这样就可以了:

      rdvi= size(deletevaluesatindex,1);   %finding rows of 'deletevaluesatindex'
      temp = cell(1,rdvi);     %Pre-allocation
      
      for i=1:rdvi
          %making a cell array of elements to be removed 
          temp(i)={deletevaluesatindex(i,1):deletevaluesatindex(i,2)};
      end
      
      temp = cell2mat(temp); %Now temp array contains the elements to be removed
      Z(temp)=[]  % Removing the elements
      

      【讨论】:

        【解决方案3】:

        如果您控制deletevaluesatindex 的生成方式,则可以改为使用 MATLAB 的冒号运算符直接生成范围,然后使用将它们连接在一起

        deletevaluesatindex=[1:3 6:7 10:12]
        

        然后使用你建议的表达方式

        Z([deletevaluesatindex])=[]
        

        如果你必须使用给定的deletevaluesatindex,你可以使用循环或类似this的东西生成连接范围

        lo = deletevaluseatindex(:,1)
        up = deletevaluseatindex(:,2)
        x = cumsum(accumarray(cumsum([1;up(:)-lo(:)+1]),[lo(:);0]-[0;up(:)]-1)+1);
        deleteat = x(1:end-1)
        

        【讨论】:

        • 我可以控制 deletevaluesatindex 的生成方式。如果我有 x=1,y=3,我怎样才能将它们连接成 1:3 然后插入到 deletevaluesatindex。我不能将它们连接为字符串,然后我不能在 Z([deletevaluesatindex])=[] 中使用 then
        • x:y 会生成1 2 3,所以你可以做deletevaluesatindex = horzcat(deletevaluesatindex, x:y)
        【解决方案4】:

        编辑: 如 cmets 所述,此解决方案仅适用于 GNU Octave

        使用 bsxfun 这是可能的:

        Z=[1 24 3 4 52 66 77 8 21 100 101 120 155];
        deletevaluesatindex = [1 3; 6 7;10 12];
        idx = 1:size(deletevaluesatindex ,1);
        idx_rm=bsxfun(@(A,B) (A(B):deletevaluesatindex (B,2))',deletevaluesatindex (:,1),idx);
        Z(idx_rm(idx_rm ~= 0))=[]
        

        【讨论】:

        • 它给出了以下错误:错误使用 bsxfun 无效的输出尺寸。 idx_rm=bsxfun(@(A,B) (A(B):deletevaluesatindex (B,2))',deletevaluesatindex (:,1),idx) 行出错;
        • @ryh12 我在 GNU Octave 中测试过。在线演示:rextester.com/OCUL14882
        • @Sardar_Usama 谢谢,答案已更新,提到它仅适用于 Octave
        猜你喜欢
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2014-08-18
        • 2018-05-02
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        相关资源
        最近更新 更多