필터 지우기
필터 지우기

Loop over two variables

조회 수: 13 (최근 30일)
William White
William White 2017년 6월 11일
댓글: dpb 2017년 6월 11일
I have a formula
U(x,y) = some formula that depends on x and y
x and y are Cartesian coordinates and U is the output that depends on x and y.
I want to create an array U that contains the value of U for many x and y. Usually, I would use meshgrid, but do not want to do this (for particular reasons..).
The domain of x and y is something like x from -x to +x in small definable increments y from -y to +y in small definable increments
So I guess I will have two loops one nested in another?
So it might be y = -y then calculate all values of U for all x and for fixed y = -y
then increase the value of y incrementally and calculate all values of U for all x and y+increment of y
This seems simple, but I am getting confused!
thanks for your help W
  댓글 수: 5
William White
William White 2017년 6월 11일
편집: William White 2017년 6월 11일
The function U is complicated and has many variables.
One such variable, T is
T = atan a + atan b
where a and b are functions of x and y too.
So the function is something along the lines of
U = x,y,T, etc.etc.
I have to determine the relationship between a and b along the lines of
If a>0 and ab<-1 then T = something else
etc. etc.
So using the meshgrid a and b are arrays rather than single values.
Once the programme runs through the logic for a single value of a and b, T is defined.
When a and b are arrays, T is not defined.
I can post the function in full here, but it is rather long (very long)
dpb
dpb 2017년 6월 11일
"If a>0 and b<-1 then T = ... So using the meshgrid a and b are arrays rather than single values."
Sure. But logical addressing can solve that dilemma...
isAB=(a>0 & b<-1); % logical array of condition
T( isAB)=whatever(x(isAB),y(isAB),Q,R,S,...); % compute those
T(~isAB)=thealternate(x(~isAB),y(~isAB),Q,R,S,...); % the rest

댓글을 달려면 로그인하십시오.

채택된 답변

Geoff Hayes
Geoff Hayes 2017년 6월 11일
William - you could do something like the following if you assume that you know your domains for x and y.
numElementsX = length(x);
numElementsY = length(y);
U = zeros(numElementsX, numElementsY);
for r=1:numElementsX
for s=1:numElementsY
U(r,s) = func(x(r),y(s)); % func is just some function that you have defined
end
end
So like you thought, we can use two loops to iterate over all elements contained in the x array and those in the y array. On each iteration of the outer loop, we fix the value of x to be x(r) and then iterate over each element in the y array. And then repeat for the next value of x.
  댓글 수: 2
William White
William White 2017년 6월 11일
I'll give it a go. My domain for x and y is something like -3E-9 to +3E-9 with about 1000 increments (these are very small distances!).
Does this loop work for negative values of x and y?
dpb
dpb 2017년 6월 11일
I'm still not convinced you can't use meshgrid (with some rework of your function, of course), but for those kinds of numbers use linspace
x=linspace(xLo,xHi,1000); % ditto for y
then as above iterate over x,_y_
The alternative as shown above still works as well altho again you would need to vectorize fnU(x,y) to make use of it.
BTW, it'll probably run noticeably faster if you switch order of for loops and iterate over r first; that is sequential memory storage order in Matlab. 1000x1000 is small enough may not make much difference, but...

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by