Если я правильно понял, вы хотите найти максимум на основе размера матрицы, как в матрице XxYxZ, вы хотите найти максимум вдоль X dim, Y dim и Z dim. Если это так, почему бы не использовать функцию max с селективностью размеров? Вы уже используете max, чтобы найти наибольшее число.
s = rng(8675309); % set random # gen
test = rand(13,4,6)*50; % creates a 3D matrix
[Xm, Xidx] = max(test,[],1) % Finds max across X dim
[Ym, Yidx] = max(test,[],2) % Finds max across Y dim
[Zm, Zidx] = max(test,[],3) % Finds max across Z dim
Я просматриваю код, который вы предоставили, и пытаюсь выяснить, что именно вы делаете. Код правильный, так как я немного запутался, как то, что вы пытаетесь вытащить.
в любом случае.
Использование функции max на 5-й плоскости Z сгенерировало idx ниже
[~ y]= max(test(:,:,5),[],2)
y =
1
3
1
4
4
4
2
3
2
3
3
3
3
Используя ваш код, чтобы сжать и найти максимум отдельных строк, сгенерировал следующий idx:
for ii=1:size(test,1)
[II JJ(ii)]=max(squeeze(test(ii,:,5))); % Tracking your IDX numbers
data_finale_opt(ii,:)=squeeze(test(ii,JJ(ii),:));
end
JJ = transpose(JJ)
JJ =
1
3
1
4
4
4
2
3
2
3
3
3
3
И ваш метод, и мой метод генерировали одинаковые значения IDX, представляющие интерес. мы можем удалить функцию max
из цикла for, оставляя часть данных. Код ниже показывает мой код, ваш код и скорость.
s = rng(8675309); % seed to make same rand values
test = rand(172299,11,5);
%% My code
tic
[~,idx] = max(test(:,:,5),[],2);
data_finale_opt = zeros(size(test,1),size(test,3)); % building container before loop speeds up process as resources don't go into expanding the matrix.
for ii = 1:size(test,1)
data_finale_opt(ii,:)=squeeze(test(ii,idx(ii),:));
end
toc
%% Your code
tic
for ii=1:size(test,1)
[II JJ]=max(squeeze(test(ii,:,5)));
data_finale_opt2(ii,:)=squeeze(test(ii,JJ,:));
clear II JJ
end
toc
Time elapsed for my code: 0.807906 seconds.
Time elapsed for your code: 4.672404 seconds.