Вместо создания TotalNavigator
в качестве StackNavigator используйте SwitchNavigation
вместо этого в корне, например:
SwitchNavigator
|
|-SplashScreen # Create this as single screen no need to create Stack, initial screen
|
|-LoginNavigator
|
|-DrawerNavigator
Затем в LoginScreen
просто перейдите к MainDrawer
напрямую, он будет обрабатывать а также жми на спину.
Вы можете использовать линейное индексирование для доступа к каждому элементу.
for idx = 1:numel(array)
element = array(idx)
....
end
Это полезно, если вам не нужно знать что я, J, K, вы находитесь Однако, если вам не нужно знать, по какому индексу вы находитесь, вам, вероятно, лучше использовать arrayfun ()
Идея линейного индекса для массивов в 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, я считаю, что проблема была решена для тех счастливчиков, которые используют.) Как указано в нескольких других ответах, вы можете перебирать все элементы в матрице 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);
Еще одна хитрость заключается в использовании 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
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.
Вы хотите смоделировать 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.