我想以一种特殊的方式堆叠一个矩阵的行

时间:2017-10-20 08:06:13

标签: matlab

如果我有一个矩阵,其行为r1,r2,r3。每行的长度为4.因此矩阵为3x4。我想生成一个形式为

的4x8矩阵
[    r1    0 0 0 0]
[    r2    0 0 0 0]
[0 0 0 0     r2   ]
[0 0 0 0     r3   ] 

我无法使用repmatreshape看到如何执行此操作。

如果我有兴趣将其应用于mxn矩阵。所以在一般情况下,我想要2行长度为n的对角块。

3 个答案:

答案 0 :(得分:0)

我认为不需要在你的情况下使用repmat和reshape。也许某种类似的东西会起作用吗?

r      = rand(3,4);
M      = zeros(4,8);

M(1,1:4)    = r(1,:);
M(2,1:4)    = r(2,:);
M(3,5:8)    = r(2,:);
M(4,5:8)    = r(3,:);

如果你想将它扩展到更一般的情况,你可以朝着这个方向前进:

n = 12;
m = 8;

nrows_r = m/2 + 1; % make sure m is actually divisible by 2
ncols_r = n / (m/2);

r      = rand(nrows_r, ncols_r);
M2     = zeros(m,n);

for i = 1:(m/2)
    cols_range = (i-1)*ncols_r + (1:ncols_r);
    M2(2*i-1, cols_range) = r(i,:);    
    M2(2*i,   cols_range) = r(i+1,:);    
end

nm还有一些其他限制,您应该注意使其正常工作。

答案 1 :(得分:0)

使用zeros

手动推广

让我们调用原始矩阵R

R = [r1
     r2
     r3]; % r1, r2 and r3 denote 1x4 rows

然后我们可以通过使用zeros和单独的行索引创建输出来开始概括流程。

c = size(R, 2); % Number of columns in R. In the original case this is 4.
M = [R(1,:), zeros(1,c);
     R(2,:), zeros(1,c);
     zeros(1,c); R(2,:);
     zeros(1,c); R(3,:);]

更好的是,获取行数并使用2D zeros矩阵和多行索引。

[r, c] = size(R); % Rows and columns in R
halfr = ceil(r/2);  % Assuming odd number of rows in original matrix 
M = [R(1:halfr, :),   zeros(halfr, c);
     zeros(halfr, c), R(halfr:end, :)];

使用kron进行平铺

我们仍然需要R

的大小
[r, c] = size(R);
halfr = ceil(r/2);

然后我们可以使用kron

创建您想要的平铺
k = kron([1 0; 0 1], ones(halfr, c));

重复R的中间行并重复整个事物

R2 = R([1:halfr, halfr:end], [1:end, 1:end])

使用逐元素乘法

M = k.*R2

大量工作在一行:

[r, c] = size(R);
halfr = ceil(r/2);
M = kron([1 0; 0 1], ones(halfr, c)) .* R([1:halfr, halfr:end], [1:end, 1:end]);

答案 2 :(得分:0)

假设你有以下矩阵

m=4;n=3;
A = rand(m,n);

我在这里使用for循环看不出任何问题

B = [];
for i = 1:m-1
    B = blkdiag(B, A(i:i+1,:));
end

但是,如果您对某些概括感兴趣并且喜欢matlab(这是罕见的)

zzz = [[1:m-1]',[2:m]'];
B = arrayfun(@(x) A(zzz(x,:)',:),[1:m-1],'UniformOutput',false);
C = blkdiag(B{[1:m-1]});

<小时/> 如果有一个列表理解和参数在matlab中解压缩,就像python一样,那就很容易了

B = scipy.linalg.block_diag(*[A[x:x+2,:] for x in range(m-1)])