Logo

Programming-Idioms

  • Go
  • C++
  • Fortran
  • Python
  • Clojure

Idiom #309 Clone a 2D array

Create the new 2-dimensional array y containing a copy of the elements of the 2-dimensional array x.

x and y must not share memory. Subsequent modifications of y must not affect x.

import copy
y = copy.deepcopy(x)
buf := make([]T, m*n)
y = make([][]T, m)
for i := range y {
	y[i] = buf[:n:n]
	buf = buf[n:]
	copy(y[i], x[i])
}

Allocate a large buffer, slice it, copy the data.
func clone2D[M ~[][]T, T any](in M) (out M) {
	if len(in) == 0 {
		return nil
	}

	m, n := len(in), len(in[0])

	buf := make([]T, m*n)

	out = make(M, m)
	for i := range out {
		out[i] = buf[:n:n]
		buf = buf[n:]
		copy(out[i], in[i])
	}
	return out
}

Allocate a large buffer, slice it, copy the data.
integer, allocatable, dimension(:,:) :: y

y = x

An allocatable array takes the bounds of thr right hand side upon assignment.
import static java.lang.System.arraycopy;
import static java.lang.reflect.Array.newInstance;
Class<?> c = x.getClass(),
         a = c.getComponentType(),
         b = a.getComponentType();
int i, m = x.length, n;
T y[][] = (T[][]) newInstance(a, m), Y[], t[];
for (i = 0; i < m; ++i) {
    n = (t = x[i]).length;
    Y = (T[]) newInstance(b, n);
    arraycopy(t, 0, Y, 0, n);
    y[i] = Y;
}

New implementation...