У меня есть матрица F
размера D-by-N
и вектор A
длины N
случайных чисел в диапазоне [1,a]
. Я хочу создать матрицу M
размера D * a
так, чтобы каждый колокол M(:,i)
имел вектор F(:,i)
, начиная с индекса (A(i)-1)*D+1
до (A(i)-1)*D+D
.Loopless Назначение подматрица в Matlab
Пример:
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
это может занять некоторое время. Я ищу способ сделать это без цикла.
Я бы утверждать, что это довольно быстро. Вы даже потратили время на большие значения 'a/N' для проверки правильности вашего утверждения? – rayryeng
Ну, это не очень медленно, но мне хотелось бы быстрее, если это возможно, потому что эта часть моего кода запускается на каждой итерации моего основного алгоритма. На моем компьютере требуется '3s', когда' a = 3', 'D = 6' и' N = 1e6'. – Simon
Как '' '' '' '' '' A = [3 2 1 2] '? 'A' имеет элементы от' 1' до '3'. – Divakar