如何按指定行索引矩阵提取大矩阵对应行?对象变量是否适用?
问题解决:按指定行索引提取矩阵行及非矩阵对象扩展
首先得说清楚你原来的循环为什么会出错——这个逻辑从根上就不对啊!你写的循环每次都会把A中除了第B(n)行之外的所有行都删掉,第一次循环执行完,A就只剩1行了,后面的循环都是基于这个被改得面目全非的矩阵操作,不仅索引完全对应不上原矩阵,最后得到的结果肯定和你想要的差十万八千里。
正确的矩阵处理方法
对于Matlab来说,这种按指定索引批量提取行的需求,用向量化索引一步就能搞定,完全不需要循环,而且对于你说的m、n极大的大矩阵,这种方法效率比循环高太多了:
C = A(B, :);
就这么简单!你给的示例里,B是[2;4;2;1],直接用这个向量作为行索引,Matlab会自动按照B的顺序提取A中对应行,正好得到你要的C矩阵。
关于非矩阵对象的适用性
这个得分情况来看:
- 支持下标索引的数组/容器对象(比如cell数组、struct数组、数值数组等):这种向量化索引的思路完全适用。举两个例子:
- Cell数组:
cellA = {'a', 'b'; 'c', 'd'; 'e', 'f'; 'g', 'h'}; B = [2; 4; 2; 1]; cellC = cellA(B, :); % 结果就是 {'c','d'; 'g','h'; 'c','d'; 'a','b'},完美匹配B的顺序 - Struct数组:
structA(1).x = 2; structA(1).y = 5; structA(2).x = 7; structA(2).y = 3; structA(3).x = -6; structA(3).y = 4; structA(4).x = 6; structA(4).y = 7; B = [2;4;2;1]; structC = structA(B); % structC的元素顺序完全和B对应,structC(1)就是原structA(2)的内容
- Cell数组:
- 非数组类的自定义对象:这种情况就不一定了。如果你的自定义对象实现了Matlab的下标访问方法(比如
subsref),那可以用类似的索引方式;如果没实现,那可能需要遍历B中的索引,逐个提取对象的对应元素,或者用对象专门提供的批量获取接口来处理。
总的来说,向量化索引是Matlab处理这类批量选择场景的最优方案,只要对象支持下标索引,这个方法就能直接用;不支持的话,就得看对象本身的设计了。
内容的提问来源于stack exchange,提问作者Matte
相关产品推荐
相关产品推荐

