2015-02-04 1 views
0

В функции Matlab анонимным, я хочу иметь функции fun_total как этотMatlab большие строки в анонимных функций

fun_total = @(x) [ 0; 
       1*x(1); 
       1*x(1); 
       2*x(2); 
       2*x(2); 
       ... 
       100000*x(100000); 
       100000*x(100000);] 

так вот мой код

fun_total = @(x) [0]; 
for i = 1 : 100000 
    fun_temp = @(x) i*x(i); 
    fun_total = @(x) [ fun_total(x); fun_temp(x) ]; 
    fun_total = @(x) [ fun_total(x); fun_temp(x) ]; 
end 

Моя проблема в том, что это слишком медленно, когда цикл итерация становится больше. Каждый раз, когда fun_total = @ (x) [fun_total (x); fun_temp (x)];
fun_total (x) сначала разворачивается, а затем сливается.

Теперь у меня есть решение, которое выводит мой fun_total в виде текстового файла, , а затем переходит к функции. Это может работать? или у кого-то другое эффективное решение? Спасибо!

ответ

3

Проблема, очевидно, в том, что вы создаете 100000 анонимные функции fun_temp (и 100000 вложенные функции fun_total). Это по существу то же самое, что и генерация всех m-файлов-функций function result=xTimes1(x), function result=xTimes2(x), function result=xTimes3(x), ... Который, когда вы смотрите на это так, совершенно абсурдно. Лучшее решение, безусловно, идет с векторизованным решением, например, Dan, но вы также можете всегда использовать один файл m-функций.

С точки зрения эффективности следует ожидать этой иерархии:

Много (анонимно) вызывает < много for -loop итераций < векторизация кода.

Так как промежуточный шаг к векторизованному решению, которое вы могли бы использовать:

function total = fun_total(x) 
total = zeros(2*length(x)+1,1); 
for i = 1:length(x) 
    total([2*i,2*i+1]) = [i*x(i); i*x(i)]; 
end 

, а затем генерировать функцию ручку с помощью @fun_total.

+0

специально для иерархии: +1 –

2

Может попробовать:

fun_total = @(x)reshape(repmat(1:numel(x).*x, 2, 1),[],1) 

или

fun_total = @(x)reshape([1;1]*(1:numel(x).*x),[],1)