need help vectorizing a complicated loop

2 ビュー (過去 30 日間)
supernoob
supernoob 2018 年 12 月 17 日
編集済み: Stephen23 2018 年 12 月 19 日
Hi,
I need to evaluate a vector of a function on a mesh then sum that vector at each point on the mesh. Let me elaborate:
I have a mesh:
a = -0.5:0.001:0.5;
b = a;
[A,B]=meshgrid(a,b);
At each point on that mesh, I want to evaluate a function over a vector (here, instead of giving the vector values I'm just trying to indicate that I have some vectors with some length):
% I have 3 vectors of length 2000 with some data in them
s = 2000x1 double, c = 2000x1 double, y = 2000x1 double
%at each point A,B on grid evaluate:
fake_function_vec = (c.*A+s.*B-y).^2
%result is some vector of length 2000. Now sum that vector
fake_function = sen(fake_function_vec,1)
%repeat for every other point on the mesh
I can't figure out how to do this efficiently. I'm currently using two for loops to evaluate the function (which returns a vector) and summing that vector at each point in the grid. Surely there must be a better way!
  1 件のコメント
supernoob
supernoob 2018 年 12 月 17 日
Another option is to use one for loop to evaluate each matrix element on the mesh then sum the stacked matrices. This is also slow.

サインインしてコメントする。

採用された回答

Stephen23
Stephen23 2018 年 12 月 17 日
編集済み: Stephen23 2018 年 12 月 19 日
If you change the size of the s, c and y vectors to 1x1x2000 then this is easy. For MATLAB version R2016b or later:
s = rand(1,1,2000);
c = rand(1,1,2000);
y = rand(1,1,2000);
M = sum((c.*A+s.*B-y).^2,3)
For MATLAB versions prior to R2016b use bsxfun to replace the arithmetic operators.
  1 件のコメント
supernoob
supernoob 2018 年 12 月 19 日
Thanks so much! Unfortunately this took it from 30s per evaluation to 70s, which really surprised me.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

タグ

製品


リリース

R2017b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by