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

时间:2014-03-19 17:08:12

标签: matlab matrix

我正在尝试设置一些代码来提取矩阵的某些元素,并按照提取的顺序将这些值仅保留在另一个矩阵中。

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

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

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

因此,我不再使用两个单独的矩阵,而是按照原始的时间顺序想要一个矩阵(同样,1×8矩阵由4,5,9,10,14,15,19,20的元素组成) 。基本上,我希望能够为任意数量的值执行此操作,同时仍保持元素所在的原始顺序。

3 个答案:

答案 0 :(得分:2)

r4开头的索引分别创建索引到5的所有索引,然后对它们进行排序以保持元素的顺序({1} }。

所以,这应该有效 -

r

答案 1 :(得分: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

答案 2 :(得分: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(:)).';