How to vectorize these codes

1 回表示 (過去 30 日間)
Xianjie
Xianjie 2012 年 11 月 5 日
Dear all,
these days i am dosing some modification on my code with vectorization. For the following codes:
function y=gam(a,m,n)
% cos(m*pi*x/a)*sin(n*pi*x/a)
if m==0
if n==m
y=0;
else
y=-a*(-1+(-1)^n)/(n*pi);
end
else
if n==m
y=0;
else
y=a*n*(-1+(-1)^(m+n))/(pi*(m^2-n^2));
end
end
I vectorlize it, but when m equal to n, the results is NAN. So please help me on vectorlizing it.
Thank you.
[Code formated, Jan - Please format your code in the future, thanks]

回答 (2 件)

Jan
Jan 2012 年 11 月 5 日
編集済み: Jan 2012 年 11 月 6 日
There is no loop and therefore it is not trivial to guess, which operation you want to be vectorized.
[EDITED] Now your problem got clear, thanks.
function y = gam(a,m,n)
y = zeros(size(m));
index = (m == 0 & n ~= m);
y(index) = -a*(-1+(-1).^n(index)) ./ (n(index)*pi);
index = (m ~= 0 & n ~= m);
y(index) = a.*n(index).*(-1+(-1).^(m(index)+n(index))) ./ ...
(pi*(m(index).^2 - n(index) .^ 2));
end
Not tested because I cannot run Matlab currently.
But this is a guess only. I cannot conclude what the vectorized version of "n == m" should be. Is it "ismember(n, m)" or "n == m" or "any(n == m, 2)" etc?
  1 件のコメント
Xianjie
Xianjie 2012 年 11 月 6 日
m and n are matrix. So i want to vectorize this code.

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


Robert Cumming
Robert Cumming 2012 年 11 月 5 日
編集済み: Robert Cumming 2012 年 11 月 5 日
  4 件のコメント
Xianjie
Xianjie 2012 年 11 月 6 日
Ok. Thank. Is there some other ways to solve this problem. Because if the dimension of matrix is large, the for loop will cost a lot of time. Thank you
Robert Cumming
Robert Cumming 2012 年 11 月 6 日
m = [1 2 0 4 5];
n = [3 3 0 3 3];
y = m./n
y(isnan(y)) = 0
No for loop required - as I said use logical indexing and isnan.

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

カテゴリ

Help Center および File ExchangeMultidimensional Arrays についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by