## Element-by-Element Assignment to Vectors

4 posts
• Page

**1**of**1**### Element-by-Element Assignment to Vectors

The monadic function below assigns values to vector G on an element-by-element basis using values contained in vector x (the argument). x and G have the same rank, in this example, the rank is 5. Is there any way to avoid using line 3 below which defines G as a vector and assigns it rank 5? I know that vector G can be constructed by concatenation. However, given the length of the expressions that define elements of G, the element-by-element assignment is easier to write and modify. This code works fine but line 3 is more like FORTRAN or BASIC than APL.

Output←F2 x;G;K1;K2;K3;K4;K5;P;Pstd

⍝ Obtain rank of vector x and initially fill vector G with zeros

G←(⍴x)⍴0

K1←0.02497 ⋄ K2←0.01283 ⋄ K3←0.002062 ⋄ K4←0.002894 ⋄ K5←0.10894

P←0.1 ⋄ Pstd←0.1

G[1]←K1-((2×x[1])*2)×(P÷Pstd)÷((2×x[3])+x[4]-x[1])×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[2]←K2-((2×x[2])*2)×(P÷Pstd)÷(x[3]+x[5]-x[2])×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[3]←K3-(((2×x[3])+x[4]-x[1])*2)×(x[3]+x[5]-x[2])×(P÷Pstd)÷ ((2-(2×x[3])+2×x[4])*2)×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[4]←K4-(x[4]+(2×x[3])-x[1])×((2×x[4])*2)×(P÷Pstd)÷((2-(2×x[3])+2×x[4])*2)×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[5]←K5-((2×x[5])*2)×(x[3]+x[5]-x[2])×(P÷Pstd)÷((1-2×x[5])*2)×(3+x[1]+x[2]+x[3]+x[4]+x[5])

Output←G

Output←F2 x;G;K1;K2;K3;K4;K5;P;Pstd

⍝ Obtain rank of vector x and initially fill vector G with zeros

G←(⍴x)⍴0

K1←0.02497 ⋄ K2←0.01283 ⋄ K3←0.002062 ⋄ K4←0.002894 ⋄ K5←0.10894

P←0.1 ⋄ Pstd←0.1

G[1]←K1-((2×x[1])*2)×(P÷Pstd)÷((2×x[3])+x[4]-x[1])×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[2]←K2-((2×x[2])*2)×(P÷Pstd)÷(x[3]+x[5]-x[2])×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[3]←K3-(((2×x[3])+x[4]-x[1])*2)×(x[3]+x[5]-x[2])×(P÷Pstd)÷ ((2-(2×x[3])+2×x[4])*2)×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[4]←K4-(x[4]+(2×x[3])-x[1])×((2×x[4])*2)×(P÷Pstd)÷((2-(2×x[3])+2×x[4])*2)×(3+x[1]+x[2]+x[3]+x[4]+x[5])

G[5]←K5-((2×x[5])*2)×(x[3]+x[5]-x[2])×(P÷Pstd)÷((1-2×x[5])*2)×(3+x[1]+x[2]+x[3]+x[4]+x[5])

Output←G

- REMINGTON30
**Posts:**11**Joined:**Fri Aug 11, 2017 2:17 pm

### Re: Element-by-Element Assignment to Vectors

You mean "same shape," rather than "same rank," right?

Putting aside the fact that you have some common subexpressions repeated and that if x has fewer than five elements, the function fails, it isn't clear what you do with expressions beyond G[5] in the general case. So I'm guessing a bit here.

Below is a simple rewrite of your function, assuming just the five-element case. Perhaps there is something useful in it. By the way, for small vectors, I wouldn't worry about the distinction between setting indexed elements (G[1] etc.) and then simply returning G versus setting named items and then catenating them into the result variable (e.g. G←G1 G2 G3 G4 G5). For large vectors, the latter is unwieldy.

I tested to make sure it gave the same results as yours using repeated calls to:

Putting aside the fact that you have some common subexpressions repeated and that if x has fewer than five elements, the function fails, it isn't clear what you do with expressions beyond G[5] in the general case. So I'm guessing a bit here.

Below is a simple rewrite of your function, assuming just the five-element case. Perhaps there is something useful in it. By the way, for small vectors, I wouldn't worry about the distinction between setting indexed elements (G[1] etc.) and then simply returning G versus setting named items and then catenating them into the result variable (e.g. G←G1 G2 G3 G4 G5). For large vectors, the latter is unwieldy.

(G1 G2 G3 G4 G5)←F2a x;K;P∆;sq;x∆;⎕IO

⎕IO←1

'F2a x: Argument "x" must have 5 or more items'⎕SIGNAL 11/⍨5>⍴x

⍝ Obtain *SHAPE* of vector x and initially fill vector G with zeros

⍝ Not sure what elements beyond G[5] were used for...

K←0.02497 0.01283 0.002062 0.002894 0.10894

⍝ P←0.1 ⋄ Pstd←0.1

P∆←1 ⍝ Are P and Pstd constants?

x∆←3++/5↑x ⍝ Only first five?

sq←×⍨ ⍝ Just to make the expressions BELOW easier to read.

⍝ I restructured a tiny bit for perspicuity.

G1←K[1]-(sq 2×x[1])×P∆÷x∆×(2×x[3])+x[4]-x[1]

G2←K[2]-(sq 2×x[2])×P∆÷x∆×x[3]+x[5]-x[2]

G3←K[3]-(sq(2×x[3])+x[4]-x[1])×(x[3]+x[5]-x[2])×P∆÷x∆×sq 2-(2×x[3])+2×x[4]

G4←K[4]-(x[4]+(2×x[3])-x[1])×(sq 2×x[4])×P∆÷x∆×sq 2-(2×x[3])+2×x[4]

G5←K[5]-(sq 2×x[5])×(x[3]+x[5]-x[2])×P∆÷x∆×sq 1-2×x[5]

I tested to make sure it gave the same results as yours using repeated calls to:

{(F2 ⍵)≡F2a ⍵}?5⍴0

- petermsiegel
**Posts:**50**Joined:**Thu Nov 11, 2010 11:04 pm

### Re: Element-by-Element Assignment to Vectors

Thank you Peter. I will incorporate most of your suggestions into my code. The formulation of the problem requires that x, G, and K always have the same number of elements. Since x is an input (argument), ⍴x provides the number of elements in both G and K. I like your re-write of the expressions defining G.

Incidentally, the code I provided is part of the solution for the equilibrium chemical composition of an ideal gas mixture. Elements of K are the equilibrium constants for 5 simultaneous chemical reactions, elements of G are the 5 non-linear algebraic equations that must be solved by a separate function to yield the 5 elements of x. The amounts of each chemical species present are computed algebraically from the vector x.

Incidentally, the code I provided is part of the solution for the equilibrium chemical composition of an ideal gas mixture. Elements of K are the equilibrium constants for 5 simultaneous chemical reactions, elements of G are the 5 non-linear algebraic equations that must be solved by a separate function to yield the 5 elements of x. The amounts of each chemical species present are computed algebraically from the vector x.

- REMINGTON30
**Posts:**11**Joined:**Fri Aug 11, 2017 2:17 pm

### Re: Element-by-Element Assignment to Vectors

Good luck - and Happy New Year. Glad to see you are on your way to the solution you want.

- petermsiegel
**Posts:**50**Joined:**Thu Nov 11, 2010 11:04 pm

4 posts
• Page

**1**of**1**### Who is online

Users browsing this forum: No registered users and 2 guests

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group