#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. Спасибо за помощь, это было похоже на доение муравьев за полезную информацию здесь …. вычислить в одну строку… это может потопить корабли