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

Arrays 删除数组中特定索引范围之间的值,arrays,matlab,matrix,Arrays,Matlab,Matrix,我有一个数组: Z = [1 24 3 4 52 66 77 8 21 100 101 120 155]; 我有另一个数组: deletevaluesatindex=[1 3; 6 7;10 12] 我想删除数组deleteValuesIndex 因此,Z的结果是: Z=[4 52 8 21 155]; 我尝试使用下面的表达式,但不起作用: X([deletevaluesatindex])=[] 如果控制如何生成deleteValuesIndex,则可以使用MATLAB的冒号运算符直接生

我有一个数组:

Z = [1 24 3 4 52 66 77 8 21 100 101 120 155];
我有另一个数组:

deletevaluesatindex=[1 3; 6 7;10 12]
我想删除数组
deleteValuesIndex

因此,
Z
的结果是:

Z=[4 52 8 21 155];
我尝试使用下面的表达式,但不起作用:

X([deletevaluesatindex])=[]

如果控制如何生成
deleteValuesIndex
,则可以使用MATLAB的冒号运算符直接生成范围,并使用

deletevaluesatindex=[1:3 6:7 10:12]
然后用你建议的表达

Z([deletevaluesatindex])=[]
如果必须使用给定的
deleteValuesIndex
,则可以使用循环或类似方法生成串联范围


编辑:如评论所述,此解决方案仅适用于GNU倍频程

使用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))=[]
这可以做到:

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
使用和的另一个解决方案:



我可以控制如何生成DeleteValuesIndex。如果x=1,y=3,如何将它们连接成1:3,然后插入deleteValuesIndex。我不能将它们连接为字符串,那么我不能在Z中使用then([DeleteValuesIndex])=[]
x:y
将生成
1 2 3
,因此您可以执行
DeleteValuesIndex=horzcat(DeleteValuesIndex,x:y)
它给出了以下错误:使用bsxfun无效输出维度时出错。行idx_rm=bsxfun(@(A,B)(A(B):deletevaluesatindex(B,2))’,deletevaluesatindex(:,1),idx)上的错误@ryh12我用GNU八度音阶测试。在线演示:@Sardar_Usama谢谢,答案更新,提到它只在八度音阶下工作
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
%// 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