Matlab中的无环子矩阵分配

Loopless submatrix assignment in Matlab

我有一个大小为 D-by-N 的矩阵 F 和一个长度为 N 的向量 A,由 [1,a] 范围内的随机整数组成。我想创建一个大小为 D * a 的矩阵 M,这样每个列 M(:,i) 都有从索引 (A(i)-1)*D+1(A(i)-1)*D+D 的向量 F(:,i) .

示例:

F = [1 2 3 10
     4 5 6 22]

A = [3 2 1 2]

a = 4

M = [0 0 3 0
     0 0 6 0
     0 2 0 10
     0 5 0 22
     1 0 0 0
     4 0 0 0
     0 0 0 0
     0 0 0 0]

我可以用一个简单的循环来完成

        for i = 1 : N
            M((A(i)-1)*D+1:(A(i)-1)*D+D,i) = F(:,i);
        end

但是对于大型 N 这可能需要一段时间。我正在寻找一种无需循环的方法。

您可以使用 bsxfun 作为基于 linear-indexing 的方法 -

[D,N] = size(F);    %// Get size of F

start_idx = (A-1)*D+1 + [0:N-1]*D*a;          %// column start linear indices
all_idx = bsxfun(@plus,start_idx,[0:D-1]');   %//'# all linear indices

out = zeros(D*a,N); %// Initialize output array with zeros
out(all_idx) = F;   %// Insert values from F into output array

样本运行-

F =
     1     2     3    10
     4     5     6    22
A =
     3     2     1     2
a =
     4
out =
     0     0     3     0
     0     0     6     0
     0     2     0    10
     0     5     0    22
     1     0     0     0
     4     0     0     0
     0     0     0     0
     0     0     0     0