Matlab:提取矩阵的第N个元素,同时保持原始矩阵的顺序

3

我正在尝试设置一些代码,以提取矩阵的特定元素,并将这些值保留在另一个矩阵中,按照它们被提取的顺序。

例如:如果我有一个随机的1X20矩阵,但只想要每个第N个元素= 5个元素,从4和5开始,我希望它构建一个新的矩阵(1x8),仅包含4、5、9、10、14、15、19、20。

到目前为止,我所拥有的是:

r = rand(1,20);
n = 5;
a = r(4 : n : end);
b = r(5 : n : end);

所以,我需要的不是两个分开的矩阵,而是一个按照时间顺序排列的矩阵(再次强调,这个矩阵是由4、5、9、10、14、15、19、20这些元素按照原有的顺序组成的1x8矩阵)。实质上,我希望能够在保持元素原始顺序的情况下对任意数量的值进行排序。

3个回答

2
创建所有的索引来分别为以4和5开头的索引进行索引,然后将它们排序以保持原始在r中的元素顺序。 因此,应该按照以下方式操作-
ab = r(sort([4:n:numel(r) 5:n:numel(r)]))

搞定了,而且非常简单!我早该更快地寻找排序函数。谢谢! - Adamosphere
是的,对于你的情况,我认为这很简单和高效。 - Divakar

2

一个适用于可变数量起始值的更通用的解决方案:

% example
A = 1:20;

% starting values and number of values to skip
a = [4,5];
n = 5;

% index vector
idx = bsxfun(@plus,a',(0:numel(A)/n-1)*n)

% indexing
result = A(idx(:))

返回:

idx(:)' =  4     5     9    10    14    15    19    20

另一个例子:
A = 1:40;
a = [3,4,7];
n = 10;
idx = bsxfun(@plus,a',(0:numel(A)/n-1)*n)

返回:

idx(:)' =  3     4     7    13    14    17    23    24    27    33    34    37

1
谢谢!我特别喜欢第二个例子以及它的多功能性! - Adamosphere

1
你可以使用ndgrid来实现(这个想法来自于kron的代码,它所做的与你想要的差不多,只是用乘积代替了求和):
a = [4 5]; %// initial values
M = 20; %// maximum value
s = 5; %// step

[ii jj] = ndgrid(a,0:s:M-max(a));
ind = (ii(:)+jj(:)).';

1
我从来没有理解过在你的很多答案中使用 . 而不是 ' 的目的。你为什么这样做? - Robert Seifert
这种情况发生在很多人身上 :-) '共轭 转置,而 .' 是标准转置。当我只想转置时,我使用 .'(即使参数不是复数,因此对它们进行共轭操作并没有什么区别)。从概念上讲,不引入不必要的共轭更清晰明了。养成使用 ' 进行转置的习惯可能会导致问题。 - Luis Mendo
虽然这个操作符在我的眼中非常具有误导性,因为它暗示着应该用于逐元素的复共轭转置。不管怎样,谢谢 ;) - Robert Seifert
@thewaywewalk 我同意。这里的点号是具有误导性的,因为它暗示了逐元素操作,而在这种情况下并没有意义。 - Luis Mendo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接