Как я выполняю итерации через каждый элемент в n-мерной матрице в MATLAB?

Вместо создания TotalNavigator в качестве StackNavigator используйте SwitchNavigation вместо этого в корне, например:

SwitchNavigator
|
|-SplashScreen   # Create this as single screen no need to create Stack, initial screen
|
|-LoginNavigator
|
|-DrawerNavigator

Затем в LoginScreen просто перейдите к MainDrawer напрямую, он будет обрабатывать а также жми на спину.

80
задан gnovice 5 May 2017 в 06:46
поделиться

6 ответов

Вы можете использовать линейное индексирование для доступа к каждому элементу.

for idx = 1:numel(array)
    element = array(idx)
    ....
end

Это полезно, если вам не нужно знать что я, J, K, вы находитесь Однако, если вам не нужно знать, по какому индексу вы находитесь, вам, вероятно, лучше использовать arrayfun ()

90
ответ дан 24 November 2019 в 09:55
поделиться

Идея линейного индекса для массивов в matlab является важной. Массив в MATLAB - это просто вектор элементов, расположенных в памяти. MATLAB позволяет использовать либо индекс строки и столбца, либо один линейный индекс. Например,

A = magic(3)
A =
     8     1     6
     3     5     7
     4     9     2

A(2,3)
ans =
     7

A(8)
ans =
     7

Мы можем видеть порядок хранения элементов в памяти, разворачивая массив в вектор.

A(:)
ans =
     8
     3
     4
     1
     5
     9
     6
     7
     2

Как видите, восьмой элемент - это число 7. На самом деле функция find возвращает свои результаты. как линейный индекс.

find(A>6)
ans =
     1
     6
     8

В результате мы можем получить доступ к каждому элементу по очереди из общего массива, используя один цикл. Например, если мы хотим возвести в квадрат элементы A (да, я знаю, что есть лучшие способы сделать это), можно сделать это:

B = zeros(size(A));
for i = 1:numel(A)
  B(i) = A(i).^2;
end

B
B =
    64     1    36
     9    25    49
    16    81     4

Существует много обстоятельств, когда линейный индекс более полезен. Преобразование между линейным индексом и двумя (или более высокими) размерными индексами осуществляется с помощью функций sub2ind и ind2sub.

Линейный индекс применяется в целом к ​​любому массиву в matlab. Таким образом, вы можете использовать его в структурах, массивах ячеек и т. Д. Единственная проблема с линейным индексом - это когда они становятся слишком большими. MATLAB использует 32-битное целое число для хранения этих индексов. Поэтому, если в вашем массиве более 2 ^ 32 элементов, линейный индекс завершится ошибкой. Это действительно проблема, только если вы часто используете разреженные матрицы, а иногда это вызывает проблемы. (Хотя я не использую 64-битную версию MATLAB, я считаю, что проблема была решена для тех счастливчиков, которые используют.)

Таким образом, вы можете использовать его в структурах, массивах ячеек и т. Д. Единственная проблема с линейным индексом - это когда они становятся слишком большими. MATLAB использует 32-битное целое число для хранения этих индексов. Поэтому, если в вашем массиве более 2 ^ 32 элементов, линейный индекс завершится ошибкой. Это действительно проблема, только если вы часто используете разреженные матрицы, а иногда это вызывает проблемы. (Хотя я не использую 64-битную версию MATLAB, я считаю, что проблема была решена для тех счастливчиков, которые используют.)

Таким образом, вы можете использовать его в структурах, массивах ячеек и т. Д. Единственная проблема с линейным индексом - это когда они становятся слишком большими. MATLAB использует 32-битное целое число для хранения этих индексов. Поэтому, если в вашем массиве более 2 ^ 32 элементов, линейный индекс завершится ошибкой. Это действительно проблема, только если вы часто используете разреженные матрицы, а иногда это вызывает проблемы. (Хотя я не использую 64-битную версию MATLAB, я считаю, что проблема была решена для тех счастливчиков, которые используют.)

33
ответ дан 24 November 2019 в 09:55
поделиться

Как указано в нескольких других ответах, вы можете перебирать все элементы в матрице A (любого размера) с использованием линейного индекса от 1 до цифр (А) в одном цикле for. Есть также пара функций, которые вы можете использовать: arrayfun и cellfun .

Давайте сначала предположим, что у вас есть функция, которую вы хотите применить к каждому элементу A (называется my_func ). Сначала вы создаете описатель функции для этой функции:

fcn = @my_func;

Если A является матрицей (типа double, single и т. Д.) Произвольного измерения, вы можете использовать arrayfun для применения my_func к каждому элементу:

outArgs = arrayfun(fcn, A);

Если A является массивом ячеек произвольной размерности, Вы можете использовать cellfun , чтобы применить my_func к каждой ячейке:

outArgs = cellfun(fcn, A);

Функция my_func должна принимать A в качестве входа. Если есть какие-либо выходы из my_func , они помещаются в outArgs , который будет того же размера / размера, что и A .

Одно предупреждение на выходах ... если my_func возвращает выходные данные разных размеров и типов, когда он работает с различными элементами A , то outArgs необходимо будет преобразовать в массив ячеек , Это можно сделать, вызвав arrayfun или cellfun с дополнительной парой параметр / значение:

outArgs = arrayfun(fcn, A, 'UniformOutput', false);
outArgs = cellfun(fcn, A, 'UniformOutput', false);
15
ответ дан 24 November 2019 в 09:55
поделиться

Еще одна хитрость заключается в использовании ind2sub и sub2ind . В сочетании с цифрами и размерами , это может позволить вам сделать что-то вроде следующего, который создает N-мерный массив, а затем устанавливает все элементы на «диагонали» как 1.

d = zeros( 3, 4, 5, 6 ); % Let's pretend this is a user input
nel = numel( d );
sz = size( d );
szargs = cell( 1, ndims( d ) ); % We'll use this with ind2sub in the loop
for ii=1:nel
    [ szargs{:} ] = ind2sub( sz, ii ); % Convert linear index back to subscripts
    if all( [szargs{2:end}] == szargs{1} ) % On the diagonal?
        d( ii ) = 1;
    end
end
13
ответ дан 24 November 2019 в 09:55
поделиться

If you look deeper into the other uses of size you can see that you can actually get a vector of the size of each dimension. This link shows you the documentation:

www.mathworks.com/access/helpdesk/help/techdoc/ref/size.html

After getting the size vector, iterate over that vector. Something like this (pardon my syntax since I have not used Matlab since college):

d = size(m);
dims = ndims(m);
for dimNumber = 1:dims
   for i = 1:d[dimNumber]
      ...

Make this into actual Matlab-legal syntax, and I think it would do what you want.

Also, you should be able to do Linear Indexing as described here.

-1
ответ дан 24 November 2019 в 09:55
поделиться

Вы хотите смоделировать n-вложенные циклы for.

Перебор n-мерного массива можно рассматривать как увеличение n-значного числа.

В каждом измерении у нас есть столько цифр, сколько длина этого измерения.

Пример:

Предположим, у нас есть массив (матрица)

int[][][] T=new int[3][4][5];

в «для обозначения», у нас есть:

for(int x=0;x<3;x++)
   for(int y=0;y<4;y++)
       for(int z=0;z<5;z++)
          T[x][y][z]=...

для моделирования этого вам нужно будет использовать «n-значное числовое обозначение»

У нас есть Трехзначное число, с 3 цифрами для первой, 4 для второй и пяти для третьей цифры

Мы должны увеличить число, чтобы получить последовательность

0 0 0
0 0 1
0 0 2    
0 0 3
0 0 4
0 1 0
0 1 1
0 1 2
0 1 3
0 1 4
0 2 0
0 2 1
0 2 2
0 2 3
0 2 4
0 3 0
0 3 1
0 3 2
0 3 3
0 3 4
and so on

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

Это непростая задача. К сожалению, я не могу помочь с обозначением Matlab.

-1
ответ дан 24 November 2019 в 09:55
поделиться
Другие вопросы по тегам:

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