Skip to the content.

The Replicate Functions / and

Hybridity

/ and are hybrids - they are both functions and operators. For use of / and as operators please see the appropriate operator documentation.

’/’ Used Dyadically With Constants On Both Sides

When used dyadically with constants the LHS must be a number or boolean scalar or a scalar array containing only numbers or booleans.

3 4 / 5 6

it creates a vector with 3 copies of 5 and 4 copies of 6

5 5 5 6 6 6 6

This can take nested vectors on the RHS of course:

3 4 / (2 3) (4 (5 6))

giving:

┌───┐ ┌───┐ ┌───┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│2 3│ │2 3│ │2 3│ │4 ┌───┐│ │4 ┌───┐│ │4 ┌───┐│ │4 ┌───┐│
└───┘ └───┘ └───┘ │  │5 6││ │  │5 6││ │  │5 6││ │  │5 6││
                  │  └───┘│ │  └───┘│ │  └───┘│ │  └───┘│
                  └───────┘ └───────┘ └───────┘ └───────┘

But not on the LHS.

The scalar zero returns a null scalar.

0 / 1 2 3

Giving:


Default Rank With Scalars on the LHS

/ operates on the first axis. Remember that axes are numbered right to left so the first axis here has a length 3

A ← 2 3 ⍴ 1 2 3 4 5 6
2 / A

Gives:

1 1 2 2 3 3
4 4 5 5 6 6

Default Rank With Vectors on the LHS

If the length of the LHS vector is the same as the principle dimension then the elements will be replicated pairswise:

A ← 2 3 ⍴ 1 2 3 4 5 6
2 3 4 / A

results in:

1 1 2 2 2 3 3 3 3
4 4 5 5 5 6 6 6 6

The Barred Replicate Function With Vectors on the LHS

This function applies to the last axis:

A ← 2 3 ⍴ 1 2 3 4 5 6
2 3 ⌿ A

Gives

1 2 3
1 2 3
4 5 6
4 5 6
4 5 6

The same caveats pertain with regard the length of the LHS - except this must match the last dimension.

Use With Axes With Scalars on the LHS

Both / and can be used with axis notation:

A ← ⍳ 24
B ← 2 3 4 ⍴ A
2 ⌿[2] B
1  2  3  4
1  2  3  4
5  6  7  8
5  6  7  8
9 10 11 12
9 10 11 12

13 14 15 16
13 14 15 16
17 18 19 20
17 18 19 20
21 22 23 24
21 22 23 24

When used with axis notation the symbols are intechangable:

A ← 2 3 4 ⍴ 1 2 3 4 5 6
2 /[2] A
1 2 3 4
1 2 3 4
5 6 1 2
5 6 1 2
3 4 5 6
3 4 5 6

1 2 3 4
1 2 3 4
5 6 1 2
5 6 1 2
3 4 5 6
3 4 5 6

/ with out axis simply means replicate along the principal axis and means replicate on the lowest axis.

With Vectors On The LHS

A ← ⍳ 24
B ← 1 2 3 4 ⍴ A
2 1 /[2] B

The first block of [3, 4] is duplicated and the second is simply replicated.

1  2  3  4
5  6  7  8
9 10 11 12

1  2  3  4
5  6  7  8
9 10 11 12

13 14 15 16
17 18 19 20
21 22 23 24

The vector [2 1] has two elements and the second axis is 2

Generating LENGTH ERRORs

If the LHS doesn’t have as many elements as the axis a LENGTH ERROR will be triggered:

A ← ⍳ 24
B ← 2 3 4 ⍴ A
2 2/[2] B
Error
A ← ⍳ 24
B ← 2 3 4 ⍴ A
2 2/[2] B
---^
LENGTH ERROR [LHS vector doesn't match the selection axis: LHS has 2 elements - RHS Axis has 3
 ] on line 3 at character 4

Invalid Axes and INDEX ERRORs

Trying to specify an Axis that is out of bounds will trigger an INDEX ERROR.

A ← ⍳ 24
B ← 1 2 3 ⍴ A
2 2 3/[2] B

throws this error:

Error
A ← ⍳ 24
B ← 1 2 3 ⍴ A
2 2 3/[2] B
-----^
LENGTH ERROR [LHS vector doesn't match the selection axis: LHS has 3 elements - RHS Axis has 2
 ] on line 3 at character 6

LHS Must Be A Scalar Or A Vector Or You Get A DOMAIN ERROR

If the LHS is an array a DOMAIN ERROR will be thrown:

A ← ⍳ 24
B ← ⍳ 4
C ← 2 2 ⍴ A
D ← 2 2 ⍴ B
D /[2] C
Error
A ← ⍳ 24
B ← ⍳ 4
C ← 2 2 ⍴ A
D ← 2 2 ⍴ B
D /[2] C
--^
DOMAIN ERROR [LHS must be a vector or a scalar: It has a shape of [2,2] ] on line 5 at character 3

Implementation Notes

The reduce operators / and ⌿' always convert lazy vectors to eager` before processing.