如果我有一个矩阵,其行为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 ]
我无法使用repmat
或reshape
看到如何执行此操作。
如果我有兴趣将其应用于mxn矩阵。所以在一般情况下,我想要2行长度为n的对角块。
答案 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
n
和m
还有一些其他限制,您应该注意使其正常工作。
答案 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)])