- Technical Services and Consulting
- Embedded Systems | Firmware Developement | Simulations
- Electrical and Electronics Engineering
vectorized operations on symbolic functions
2 ビュー (過去 30 日間)
古いコメントを表示
Hi, Can we apply vectorized operations on symbolic functions to avoid loops?
syms x1 x2 x3; % symbolic variables
y = x1^3/3 + x2^2/2 - x3; % symbolic function y
X = rand(500,3) % each row representing a combination of x1 x2 x3
I used for loop, but it is taking more time.
y_values = zeros(size(X,1))
for ii = 1:size(X,1)
y_values(ii) = subs(y, [x1, x2, x3], X(ii,:));
end
I have tried following but since there is inconsistency between sizes of old and new it don't work for me.
y_values = subs(y, [x1, x2, x3], X); % Evaluate the function for all combinations in matrix X
Thanks
0 件のコメント
採用された回答
Hassaan
2024 年 2 月 19 日
編集済み: Hassaan
2024 年 2 月 19 日
syms x1 x2 x3; % symbolic variables
y = x1^3/3 + x2^2/2 - x3; % symbolic function y
% Generate a random matrix X with 500 rows and 3 columns
X = rand(500, 3); % each row representing a combination of x1 x2 x3
% Evaluate the symbolic function y for each row in X
% Convert the matrix X to a cell array where each row is a separate cell
X_cell = num2cell(X, 2);
% Use cellfun to apply the subs function to each cell (row) of X_cell
y_values = cellfun(@(row) subs(y, [x1, x2, x3], row), X_cell);
% Convert y_values to a double array if needed
y_values = double(y_values);
disp(y_values(1:10))
-----------------------------------------------------------------------------------------------------------------------------------------------------
If you find the solution helpful and it resolves your issue, it would be greatly appreciated if you could accept the answer. Also, leaving an upvote and a comment are also wonderful ways to provide feedback.
It's important to note that the advice and code are based on limited information and meant for educational purposes. Users should verify and adapt the code to their specific needs, ensuring compatibility and adherence to ethical standards.
Professional Interests
Feel free to contact me.
2 件のコメント
その他の回答 (5 件)
Dyuman Joshi
2024 年 2 月 19 日
Better to use a function handle -
x = rand(500,3);
y = @(x) x(:,1).^3/3 + x(:,2).^2/2 - x(:,3);
out1 = y(x)
For more information, refer to these documentation pages -
2 件のコメント
Christine Tobler
2024 年 2 月 19 日
Your best approach then might be to make your input variables have the individual pages already as a third dimension:
x = randn(3, 1, 500);
y = randn(1, 6, 500);
z = x.*y;
size(z)
The formula here is of course completely made up, it would depend on what your formula for this 3x6 matrix is.
Aquatris
2024 年 2 月 19 日
編集済み: Aquatris
2024 年 2 月 19 日
Yet another method, you can define your symbolic parameter as a matrix symbolic
n = 500;
X = sym('X', [500 3]);
% I assume here you want a element wise power ('.^') instead of matrix power
y = X(:,1).^3/3 + X(:,2).^2/2 - X(:,3); % symbolic function y
X_val = rand(500,3); % each row representing a combination of x1 x2 x3
y_values = double(subs(y, X, X_val)) % Evaluate the function for all combinations in matrix X
size(y_values)
0 件のコメント
Walter Roberson
2024 年 2 月 19 日
syms x1 x2 x3; % symbolic variables
y = x1^3/3 + x2^2/2 - x3; % symbolic function y
X = rand(500,3); % each row representing a combination of x1 x2 x3
y_values = double(subs(y, {x1, x2, x3}, {X(:,1), X(:,2), X(:,3)}));
y_values(1:5)
0 件のコメント
Torsten
2024 年 4 月 21 日
編集済み: Torsten
2024 年 4 月 21 日
rng("default")
syms x1 x2 x3; % symbolic variables
y = x1^3/3 + x2^2/2 - x3; % symbolic function y
X = rand(500,3) % each row representing a combination of x1 x2 x3
y_values = arrayfun(@(i)double(subs(y,[x1,x2,x3],[X(i,1),X(i,2),X(i,3)])),1:size(X,1))
0 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!