# cross (:C)

**Syntax**

cross(func, X, [Y])

or

X <operator>:C Y

**Arguments**

func is a binary function.

X and Y can be pair/vector/matrix. They can have different data forms and sizes.

Y is optional. If Y is not specified, perform cross(func, X, X) where func must be a symmetric binary function, such as corr .

**Details**

Apply func to the permutation of all individual elements of *X* and *Y* and return a matrix.

Assume X has m elements and Y has n elements. The template returns an m (rows) by n (columns) matrix. Below is the pseudo code for the `cross`

template.

```
for(i:0~(size(X)-1)){
for(j:0~(size(Y)-1)){
result[i,j]=<function>(X[i], Y[j]);
}
}
return result;
```

If *X* and *Y* are matrices, the iteration is over the columns of *X* and *Y* .

If the result of func(X[i], Y[j]) is a scalar, the result of the `cross`

template is a matrix.

If the result of func(X[i], Y[j]) is a vector, the result of the `cross`

template is a tuple with m elements. Each of the element is a tuple with n elements.

**Examples**

`cross`

with two vectors:

```
$ x=1 2;
$ y=3 5 7;
$ x+:C y;
```

lable |
3 |
5 |
7 |
---|---|---|---|

1 |
4 |
6 |
8 |

2 |
5 |
7 |
9 |

```
$ cross(mul, x, y);
```

lable |
3 |
5 |
7 |
---|---|---|---|

1 |
3 |
5 |
7 |

2 |
6 |
10 |
14 |

```
$ cross(pow, x, y);
```

lable |
3 |
5 |
7 |
---|---|---|---|

1 |
1 |
1 |
1 |

2 |
8 |
32 |
128 |

`cross`

with two matrices:

```
$ m = 1..6$2:3;
$ m;
```

clo1 |
col2 |
col3 |
---|---|---|

1 |
3 |
5 |

2 |
4 |
6 |

```
$ n=1..4$2:2;
$ n;
```

clo1 |
col2 |
---|---|

1 |
3 |

2 |
4 |

```
$ cross(**, m, n);
```

clo1 |
col2 |
---|---|

5 |
11 |

11 |
25 |

17 |
39 |

`cross`

with a vector and a matrix:

```
$ def topsum(x,n){return sum x[0:n]};
$ a=1..18$6:3;
$ a;
```

clo1 |
col2 |
col3 |
---|---|---|

1 |
7 |
13 |

2 |
8 |
14 |

3 |
9 |
15 |

4 |
10 |
16 |

5 |
11 |
17 |

6 |
12 |
18 |

```
$ b=2 4;
$ a topsum :C b;
```

2 |
4 |
---|---|

3 |
10 |

15 |
34 |

27 |
58 |

`cross`

with tuple type results:

```
$ x=1 2
$ y=1..6$2:3
$ cross(add, x, y);
(([2,3],[4,5],[6,7]),([3,4],[5,6],[7,8]))
$ x=1 2
$ y=1..6$3:2
$ cross(add, x, y);
(([2,3,4],[5,6,7]),([3,4,5],[6,7,8]))
```