Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copying a subset of an array into another array / array slicing in C

In C, is there any built-in array slicing mechanism?

Like in Matlab for example, A(1:4)

would produce =

 1     1     1     1

How can I achieve this in C?

I tried looking, but the closest I could find is this: http://cboard.cprogramming.com/c-programming/95772-how-do-array-subsets.html

subsetArray = &bigArray[someIndex]

But this does not exactly return the sliced array, instead pointer to the first element of the sliced array...

Many thanks

like image 866
fgar Avatar asked Jan 31 '13 04:01

fgar


People also ask

Can you slice an array in C?

Array-slicing is supported in the print and display commands for C, C++, and Fortran. Expression that should evaluate to an array or pointer type. First element to be printed. Defaults to 0.


1 Answers

Thanks everyone for pointing out that there is no such built-in mechanism in C.

I tried using what @Afonso Tsukamoto suggested but I realized I needed a solution for multi-dimensional array. So I ended up writing my own function. I will put it in here in case anyone else is looking for similar answer:

void GetSlicedMultiArray4Col(int A[][4], int mrow, int mcol, int B[1][4], int sliced_mrow)
{
    int row, col;
    sliced_mrow = sliced_mrow - 1; //cause in C, index starts from 0
    for(row=0; row < mrow; row++)
    {
        for (col=0; col < mcol; col++)
        {
            if (row==sliced_mrow) B[0][col]=A[row][col];
        }
    }
}

So A is my input (original array) and B is my output (the sliced array). I call the function like this:

GetSlicedMultiArray4Col(A, A_rows, A_cols, B, target_row);

For example:

int A[][4] = {{1,2,3,4},{1,1,1,1},{3,3,3,3}};
int A_rows = 3; 
int A_cols = 4; 
int B[1][4]; //my subset
int target_row = 1;

GetSlicedMultiArray4Col(A, A_rows, A_cols, B, target_row);

This will produce a result (multidimensional array B[1][4]) that in Matlab is equal to the result of A(target_row,1:4).

I am new to C so please correct me if I'm wrong or if this code can be made better... thanks again :)

like image 81
fgar Avatar answered Oct 21 '22 10:10

fgar