从向量中获取向量矩阵

时间:2014-03-03 23:27:49

标签: arrays matlab matrix

我有一个向量x = [1,3,5,6,7],我想生成一个矩阵y,其中行y(k)= x(k:k + 2)。因此,在这种情况下得到的矩阵将是

1 3 5
3 5 6
5 6 7

如何在不使用循环的情况下实现?有没有一种聪明的方法来做索引?

4 个答案:

答案 0 :(得分:5)

这是Hankel matrix的顶部非零平方。只需使用hankel

>> X = hankel(x)
X =
     1     3     5     6     7
     3     5     6     7     0
     5     6     7     0     0
     6     7     0     0     0
     7     0     0     0     0
>> X = X(1:3,1:3)
X =
     1     3     5
     3     5     6
     5     6     7

指定的广义hankel输出:

w = floor(numel(x)/2);
X = hankel(x(1:end-w),x(w+1:end))

答案 1 :(得分:2)

使用meshgrid

的轻微设计方法
k = (length(x) + 1) / 2;
[a b] = meshgrid(1:k, 0:k-1);
y = x(a+b);

使用bsxfun

的紧凑等效项
y = x(bsxfun(@plus, (1:k)', 0:k-1));

真的愚蠢的单行:

y = x(interp2([1 3], [1;3], [1 3; 3 5], 1:3, (1:3)'));

答案 2 :(得分:1)

您可以通过以下方式执行此操作而无需直接循环:

cell2mat(arrayfun(@(k) x(k:k+2), 1:numel(x) - 2, 'UniformOutput', false)')

ans =

     1     3     5
     3     5     6
     5     6     7

尽管如此,arrayfun实际上会遍历元素1:numel(x) - 2。所以我猜它有点作弊。

答案 3 :(得分:1)

使用卷积:

n = numel(x)-2; %// x is a row vector with arbitrary length
result = conv2(x,rot90(eye(n)));
result = result(:,n:end-n+1);