Запрос оптимизации Matlab, избегая этого репутации

Это простой вопрос, я не вижу лучшего ответа, и, возможно, кто-то другой сможет! Вот код:

Пример переменных

nSim = 3000;
nRow = 10000;
data = zeros(1, 5, nRow);
data (:, 1:4, :) = rand(4, nRow)*0.5; % 4 columns of duration values
data (:, 5, :) = 1000;   % 1 column of actual value
basis.increaseRate   = 1 + (rand(nSim, 4)*0.1);

Пример расчета

dataWithSim = repmat(data(:, 1:4,:),nSim, 1, 1);    
increaseFactors = bsxfun(@power, basis.increaseRate, dataWithSim);
Values = bsxfun(@times, data(:,5,:), prod(increaseFactors,2));

Необходимость повторного матирования кажется неправильной, но я не вижу способа избежать этого.

фактически я делаю увеличение ^ данных, и мне действительно не хотелось перебирать два измерения (строки sims или data). Фиктивные данные могут быть упорядочены любым способом, который я выберу, но выходные значения должны быть матрицей nSim на nRow.

Любые идеи приветствуются. Спасибо.


person N t    schedule 23.10.2014    source источник


Ответы (1)


Вам действительно не нужно использовать это repmat. Вы можете напрямую передать эту «подматрицу» из data вот так:

increaseFactors = bsxfun(@power, basis.increaseRate, data(:,1:4,:));

bsxfun внутренне заботится о расширении singleton измерений, которые в данном случае являются первым измерением (строками) data. Поскольку basis.increaseRate имеет nSim строк, а data(:,1,4,:) имеет одну строку, он будет расширен, чтобы иметь одинаковое количество строк, то есть nSim, и, таким образом, выполняет работу по повторному матированию/расширению внутри.

Остальной код остается прежним.

person Divakar    schedule 23.10.2014
comment
Конечно, вам не нужно иметь dataWithSim в новом коде. - person Divakar; 23.10.2014
comment
Клянусь Богом, я получал бесконечные ошибки о неодноэлементных измерениях без репмата! Спасибо - я думал, что ошибаюсь, но я просто не мог этого увидеть. - person N t; 23.10.2014
comment
@Nt Забота о размерах с помощью bsxfun - это действительно вся игра. Конечно, это требует времени, но с практикой вы достаточно скоро почувствуете это! :) - person Divakar; 23.10.2014