0

我有一个 10X3 的矩阵,我想只使用每列的一个子集创建一个新矩阵,但我希望根据索引数组和从该点开始定义的范围,每列的子集都不同。

例如,如果矩阵是(当我这样做时,数字实际上不会以这种线性方式上升):

A = ...
   [1   11  21
    2   12  22
    3   13  23
    4   14  24
    5   15  25
    6   16  26
    7   17  27
    8   18  28
    9   19  29
    10  20  30]

并且索引数组pos = [5,16,24]的扩展为 +/-3(因此每个索引单元格的两侧各有 3 个单元格),那么我希望新矩阵为:

2   13  21
3   14  22
4   15  23
5   16  24
6   17  25
7   18  26
8   19  27

因此,在新矩阵中,索引数组引用的所有值都应该对齐。

我实际上是用更大的矩阵(高达 400X100)来做这个的,所以我不确定循环是否是个好主意……。

感谢您的任何想法!

4

3 回答 3

3
shift          = 3;

% Prevent out of bounds
bread          = NaN(shift,size(A,2));
A              = [bread;A;bread] 
pos            = pos+shift;

% Create mask
B              = zeros(size(A));
B(pos-shift)   = 1;
B(pos+shift+1) = -1;
B              = logical(cumsum(B));

% Select and reshape
reshape(A(B),shift*2+1,numel(pos))
于 2013-06-27T20:46:22.273 回答
1

您可以使用

r = 3;
B = A(bsxfun(@plus, pos, (-r:r)'));
于 2013-06-27T22:38:41.360 回答
0

这是一种方法arrayfun

r = 3; % Spread range
B = arrayfun(@(x) A(x-r:x+r)', pos, 'UniformOutput', false);

B将是一个单元格,但是,您可以获得一个矩阵:[B{:}]

于 2013-06-27T20:53:05.340 回答