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
我有一个大小为 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