Assigning to arrays
Indexed Assignment
Assign values at specified indices.
t←4 4⍴'some sample text'
t[⍸t∊'aeiou']←'!'
Selective Assignment
Define n←5 5⍴⍳25
in your workspace.
-
Using selections, find at least four different ways to set the bottom-right 3 by 3 submatrix in
n
to0
. For example,(2 2↓n)←0
.Hint
See which primitives may be used in a selective assignment
Modified Assignment
Experiment with the following expressions, paying particular attention to the name f← array
construct.
salaries←18250 42500 56000 57250 48640
codes←'ACDDC'
salaries×←1.1
salaries[⍸codes='C']×←1.05
a←⎕A
(3↑a),←'abc'
(¯4↑a),←'xyz' ⍝ this one will error — think about why!
At
Monadic functions take a single right argument array as input. Dyadic functions take two argument arrays.
Monadic operators take a single left operand which can be a function or an array (as in +/
where plus +
is the function operand and reduce /
is the operator).
Dyadic operators take two operands which could be functions or arrays depending on the operator's definition. For example, the rank operator F⍤k
takes a function left operand F
and array right operand k
of up to 3 elements.
Selective and indexed assignment methods will change the values of variables. The "at" operator @
merges two arrays at specified indices and returns a new array.
If a function right operand returns a boolean array when applied to ⍵
(e.g. 3=1 3 5
) then ones 1
in the boolean array determine where scalars of ⍺
are inserted.
('∆⍥'@{⍵∊'AEIOU'})2 3⍴'DYALOG'
(' '@2 3 4)'DYALOG'
(' '@(1 2)(1 3)(2 1))2 3⍴'DYALOG'
- The following expression contains an error:
('∆⍥'@1)2 3⍴'DYALOG'
Change the parenthesised function containing@
in two ways so that it gives the following results:-
∆∆∆ LOG
-
∆∆∆ ⍥⍥⍥
-
Generally, the left operand to @
is a function applied to scalars in ⍵
which are specified by a right operand that is either an array of scalar (simple or enclosed vector) indices or a boolean array returned by a right operand function. An array left operand is shorthand for a constant function that returns the array.
{1↓(1∘(819⌶)@{¯1⌽' '=⍵})' ',⍵}'my excellent heading'
Strand Assignment
Distributed assignment or strand assignment allows multiple names to be defined using a single assignment arrow ←
.
(max min avg)←{(⌈⌿⍵)(⌊⌿⍵)((+⌿÷≢)⍵)}3 1 4 1 5
Note
Strand assignment does not require names to be parenthesised, but we strongly recommend it for clarity.
We can assign items in nest
to the three variables s←'A'
v←1 2 3
and m←3 3⍴⍳9
using a single assignment arrow.
nest←('A'(1 2 3))(3 3⍴⍳9)
((s v) m)←nest
Warning
You might have some issues when using inline, modified or strand assignment in dfns. This is by design, but can be a source of confusion.
{a←3 ⋄ f←+ ⋄ a f←3 ⋄ a}⍬
3
a←3 ⋄ f←+ ⋄ a f←3 ⋄ a
6
You can get around these problems by writing ∘⊢
(or in 12.1: ∘{⍵}
) to the immediate right of any function involved:
{a←3 ⋄ f←+ ⋄ a f∘{⍵}←3 ⋄ a}⍬
6