Создайте динамическую функцию matlab с помощью arrayfun или каким-либо другим способом

#matlab

#matlab

Вопрос:

Я ищу способ создания динамических функций длиной с несколькими входами, пытался сделать это таким образом, но, похоже, я слишком медленно догадываюсь, есть ли лучший способ сделать это компактным и быстрым.

Проблема хотите создать cos с входными данными из матрицы nX3 sum(A*cos(W*t F)) , где A, W, F — столбцы из матрицы, суммируйте их все, а затем разделите на его норму. Вот что у меня есть на данный момент.

 % example input can have n rows
A = [1 2 3; 4 5 6]; 
item.fre = 0;
item.amp = 0;
item.pha = 0;
items = repmat(item, size(A, 1), 1);
for i = 1:size(A, 1)
    items(i).fre = A(i, 1);
    items(i).amp = A(i, 2);
    items(i).pha = A(i, 3);
end

fun = @(t) sum(cell2mat(arrayfun(@(i) i.amp*cos(2*pi*t*i.fre   i.pha), items, 'un',0)));

% test run all this steps just to get a norm vector 
time = 1:10;
testSignal = fun(time);
testSignal = testSignal/norm(testSignal);
 

Комментарии:

1. Что такое динамическая функция?

2. Почему бы не использовать обычную векторизацию?

3. Вы понимаете, что такое векторизация? Matlab работает с входными данными переменного размера из коробки. Похоже, вы выполняете 10-кратную работу без причины.

4. Просто чтобы уточнить, если у вас есть M строк в N временных выборках, вы хотите взять сумму по времени или по измерению? Другими словами, вам нужен вывод размера M или размера N?

5. Введите в MATLAB: t=1:10, f=[1;2], f.*t . Посмотрите на напечатанные значения. Я уверен, что вы можете расширить оттуда. Это не так сложно, как вы пытаетесь это сделать. Забудьте об анонимных функциях, структурах и массивах ячеек. Вы можете вычислить это в одной строке.

Ответ №1:

Я согласен с комментарием Криса Луэнго, чтобы забыть об анонимных функциях и структурах, сначала попробуйте самое простое решение. Похоже, вы пытаетесь добавить косинусы с разными амплитудами, частотами и фазами. Вот как я бы это сделал, чтобы сделать его очень читаемым

 A = [1 2 3; 4 5 6]; 
freq = A(:, 1);
amp = A(:, 2);
phase = A(:, 3);
time = 1:.01:10;
testSignal = zeros(size(time));
for i = 1:length(freq)
    testSignal = testSignal   amp(i) * cos(2*pi*freq(i) * time   phase(i));
end

testSignal = testSignal/norm(testSignal);
plot(time, testSignal)
grid on
 

Вы могли бы исключить amp переменные , phase , и freq , обратившись A напрямую к столбцам , но это сделало бы код намного менее читаемым.

Комментарии:

1. Спасибо за помощь, это было похоже на доение муравьев за полезную информацию здесь …. вычислить в одну строку… это может потопить корабли