MATLAB: Извлеките несколько частей матрицы, не используя циклы

Там нет общего способа передать массив в функцию или метод, который использует varargs. В этом конкретном случае, однако, вы можете подделать его, используя что-то вроде:

for (NSString *currentReplacement in array)
    [string stringByReplacingCharactersInRange:[string rangeOfString:@"%@"] 
            withString:currentReplacement];

РЕДАКТИРОВАТЬ: Принятый ответ утверждает, что есть способ сделать это, но независимо от того, насколько хрупким может показаться этот ответ, что подход гораздо более хрупкий. Он опирается на поведение, определяемое реализацией (в частности, структуру va_list), которое не гарантируется тем же. Я утверждаю, что мой ответ правильный, и предложенное мной решение менее хрупкое, поскольку оно опирается только на определенные особенности языка и структур.

8
задан Coral Doe 18 October 2012 в 10:08
поделиться

2 ответа

Есть несколько способов сделать это без циклов. Большинство решений включают расширение векторов x и y в более крупные матрицы индексов и, вероятно, будут использовать одну или несколько функций REPMAT , BSXFUN ] или SUB2IND . Хорошее руководство по индексации матриц можно найти здесь .

Однако, поскольку вы запросили элегантное решение, вот одно, которое несколько необычно. Он использует анонимные функции , а также функции ARRAYFUN и CAT :

indexFcn = @(r,c) cam1(r:(r+99),c:(c+99));
result = arrayfun(indexFcn,x,y,'UniformOutput',false);
result = cat(3,result{:});

ОБЪЯСНЕНИЕ:

Первая строка создает анонимную функцию . Это простая однострочная функция, которую можно создать «на лету», не помещая ее в m-файл. Функция определяет два входа r и c , которые используются для извлечения подматрицы 100 на 100 из cam1 . Переменная indexFcn хранит дескриптор функции , который используется для вызова функции. Обратите внимание, что значения cam1 , используемые анонимной функцией, являются статическими . Даже если значения в переменной cam1 изменятся, анонимная функция все равно будет использовать значения, которые были в cam1 , когда функция была создана.

Вторая строка вызывает ARRAYFUN , который применяет функцию к каждому элементу массива. ARRAYFUN перебирает каждую запись в x и y , передавая значения в indexFcn . Вывод сохраняется в result , массиве ячеек из 15 элементов, где каждая ячейка содержит матрицу 100 на 100.

Третья строка использует функцию CAT для объединения матриц 100 на 100 в матрицу 100 на 100 на 15.

6
ответ дан 5 December 2019 в 17:40
поделиться

Поскольку это, очевидно, домашнее задание, я не дам вам полного ответа.

Есть несколько способов индексирования в матрицу. Когда у вас есть такой набор разрозненных индексов, вам нужно использовать один индекс. Таким образом, если

A = rand(5,6)
A =
      0.81472      0.09754      0.15761      0.14189      0.65574      0.75774
      0.90579       0.2785      0.97059      0.42176     0.035712      0.74313
      0.12699      0.54688      0.95717      0.91574      0.84913      0.39223
      0.91338      0.95751      0.48538      0.79221      0.93399      0.65548
      0.63236      0.96489      0.80028      0.95949      0.67874      0.17119

A(3:4,3:4)

даст подматрицу 2x2 из A. Но мы также можем найти эту подматрицу как

reshape(A([13 14 18 19]),[2 2])
ans =
      0.95717      0.91574
      0.48538      0.79221

Почему я выбрал этот набор индексов? Для ответа вам нужно будет прочитать о sub2ind.

[I,J] = ndgrid(3:4,3:4);
sub2ind([5 6],I(:),J(:))
ans =
    13
    14
    18
    19

В конце концов, похоже, что вам нужен массив 15x100x100 из извлеченных частей. Так что создайте необходимый индексный массив из частей, которые я показал. В конце вам нужно будет окончательно изменить форму, чтобы придать ей правильную форму.

Это должно дать вам достаточный старт, чтобы закончить домашнее задание.

4
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: