删除数组中特定索引范围之间的值

时间:2016-09-10 03:46:12

标签: arrays matlab matrix

我有一个数组:

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

我有另一个阵列:

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

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

所以Z的结果是:

Z=[4 52 8 21 155];

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

X([deletevaluesatindex])=[]

4 个答案:

答案 0 :(得分:1)

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

out =    4    52     8    21   155
<?xml version="1.0" encoding="utf-32"?>
<MailTo>
  <To Name="Boss">
    <name>Name1</name>
    <mail>Name1@Mail.com</mail>
  </To>
  <Cc Name="Trainee">
    <name>Name2</name>
    <mail>Name2@Mail.com</mail>
  </Cc>
  <Cc Name="Manager">
    <name>Name3</name>
    <mail>Name3@Mail.com</mail>
  </Cc>
  <Cc Name="Assistant">
    <name>Name4</name>
    <mail>Name4@Mail.com</mail>
  </Cc>
</MailTo>

答案 1 :(得分:0)

如果您控制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)

答案 2 :(得分:0)

编辑,如评论所述,此解决方案仅适用于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))=[]

答案 3 :(得分:0)

这样做:

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