Индексирование нескольких элементов массива / матрицы аналогично matlab "var [1:10]" в C - PullRequest
1 голос
/ 22 июня 2019

для моих расчетов мне нужно индексировать в массив. Я привык к MATLAB, где вы можете индексировать таким образом, как

var[1:10]  // extracts the first through to the 10th element of "var"

Я пытаюсь найти подобный принцип в C без использования циклов, если это возможно. Из исследований я вижу только используемые петли.

Если это единственный метод, то можно использовать #define или аналогичный для создания макроса, который при написании [start:end] реализует цикл, но не виден в коде main?

Я написал базовый цикл, который можно было бы реализовать за сценой, как если бы был способ указать, что это то, что вы хотите использовать в сценарии [start:end].

#include <stdio.h>

int main() {
    int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int start = 3;
    int end = 8;
    int var[5];
    int j = 0;

    for (int i = start; i <= end; i++) {
        var[j] = array[i];
        j++;
    }

    printf("%d", var[5]);
}

Я пытаюсь сделать что-то невозможное или непрактичное? Для того, что я пытаюсь сделать, написание цикла или вызов функции загромождают код больше, чем я бы хотел.

Ответы [ 3 ]

1 голос
/ 22 июня 2019

Вы можете использовать библиотечную функцию memcpy, объявленную в string.h, вот так.Обратите внимание, что вы несете ответственность за то, чтобы в месте назначения было достаточно места.

#include    <stdlib.h> // for EXIT_SUCCESS
#include    <stdio.h>  // for printf
#include    <string.h> // for memcpy
int main( void)
{
int array[10] = {0,1,2,3,4,5,6,7,8,9};
int start = 3;
int end = 8;
int var[6]; 
    memcpy( var, array+start, (end+1-start)*sizeof array[0]);
    printf("%d\n", var[5]);
    return EXIT_SUCCESS;
}

Если вы хотите вместо этого скопировать последовательность из массива в другую часть массива (т. Е. Если источник и дескриптор перекрываются)Вы должны использовать memmove вместо этого.У него такое же соглашение о вызовах.

C низкоуровневое по сравнению с python.Хорошо писать на C означает познакомиться со стандартными библиотеками.

1 голос
/ 22 июня 2019

извлечение подмассива из массива может иметь 2 очень разных значения:

  • вы можете воздействовать на подмассив, передав указатель на элемент startи длина end - start для функции, которая ожидает ponter для массива int и длины.

  • однако обратите внимание, что если функция изменяет этот подмассив, изменения будутвстречаются и в исходном массиве, так как вы действуете над частью этого массива.

  • также обратите внимание, что значения индекса массива начинаются с 0 в C, в отличие от MATLAB, поэтому срезиз 10 элементов в начале a имеет значения индекса от 0 до 9.

  • , если вы хотите, чтобы извлеченный подмассив не мешал исходному массиву, вам нуженотдельный массив, определенный как в вашем примере или выделенный из кучи с помощью malloc или calloc.

Вот модифицированная версия вашего кода:

#include <stdio.h>

void print_array(const char *msg, const int *a, int count) {
    printf("%s", msg);
    for (int i = 0; i < count; i++) {
        printf(" %d", a[i]);
    }
    printf("\n");
}

int main() {
    int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int start = 3;  // start from the third element
    int end = 8;    // stop before the 8th element
    int var[5];     // the extracted slice has 8-3=5 elements indeed

    // print the original array
    print_array("original array:", array, 10);

    // print the slice of the original array from 3 to 8
    print_array("subarray array[3:8]:", array + 3, 8 - 3);

    // extract a copy of the subarray
    for (int i = start; i < end; i++) {
        var[i - start] = array[i];
    }

    // print the extracted array:
    print_array("extracted array:", var, 5);
    return 0;
}
1 голос
/ 22 июня 2019
for(int i = start; i <= end; i++){

    var[j] = array[i];

    j++;

}

в вашем коде вы индексируете i от 3 до 8, включая 8 (из-за знака <= вместо <) с 6 итерациями, где в вашем массиве j всего 5 элементов. ты выходишь за границы. </p>

Нет способа изменить синтаксис так, как вы хотите в C, но если вы просто хотите передать массив куда-то еще, вы можете передать указатель на него. просто не объявляйте массив внутри функции, но в глобальном пространстве.

если вы хотите выполнить некоторые операции над массивами, вы должны делать это поэлементно в циклах, и лучше написать для этого функцию вместо макросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...