2015-10-24 5 views
1

У меня есть матрица 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 это может занять некоторое время. Я ищу способ сделать это без цикла.

+0

Я бы утверждать, что это довольно быстро. Вы даже потратили время на большие значения 'a/N' для проверки правильности вашего утверждения? – rayryeng

+0

Ну, это не очень медленно, но мне хотелось бы быстрее, если это возможно, потому что эта часть моего кода запускается на каждой итерации моего основного алгоритма. На моем компьютере требуется '3s', когда' a = 3', 'D = 6' и' N = 1e6'. – Simon

+0

Как '' '' '' '' '' A = [3 2 1 2] '? 'A' имеет элементы от' 1' до '3'. – Divakar

ответ

2

Вы можете использовать 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 
+0

Спасибо, ваш код очень быстрый (в 10 раз быстрее, чем мой цикл). Однако он дает неверные результаты, если, например, все элементы 'A' являются единицами. Я тестирую, используя 'D = 2; N = 1e2; a = 4; F = rand (D, N); A = ones (1, N); ' – Simon

+0

@Simon О, я предположил, что' A' будет '1: N', мой плохой! Не могли бы вы добавить пример с чем-то не таким простым, как '[1,2,3]' в вопрос как образец? – Divakar

+0

Вы правы, пример в вопросе был слишком тривиальным и не дал понять, что 'A' содержит случайное целое число в диапазоне' [1, a] '. Я редактировал свой вопрос. – Simon

Смежные вопросы