Выберите максимум измерения из набора данных - PullRequest
1 голос
/ 17 марта 2019

У меня есть набор данных n -D, и я хотел бы выбрать данные для максимального значения измерения n

data_finale имеет размер: 172299*11*5, и я бы хотелхотел бы найти более эффективный способ, чем приведенный ниже цикл, чтобы получить значения для максимума data_finale(ii,:,5)

for ii=1:size(data_finale,1)
     [II JJ]=max(squeeze(data_finale(ii,:,5)));
     data_finale_opt(ii,:)=squeeze(data_finale(ii,JJ,:));
     clear II JJ
end

1 Ответ

0 голосов
/ 19 марта 2019

Если я правильно понял, вы хотите найти максимум на основе размера матрицы, как в матрице 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...