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