Matlab 从数据集中选择维度的最大值

Matlab 从数据集中选择维度的最大值,matlab,Matlab,我有一个n-D数据集,我想为维度的最大值选择数据n data\u finale的大小为:172299*11*5,我想找到一种比下面的循环更有效的方法来获取data\u finale(ii,:,5)的最大值。 如果我做对了,你想根据矩阵的维数找到最大值,就像在XxYxZ矩阵中一样,你想沿着X,Y和Z的维数找到最大值。如果是这种情况,为什么不使用具有维度选择性的函数?您已经在使用max查找最大的数字 s = rng(8675309); % set random # gen test = rand(1

我有一个
n
-D数据集,我想为维度的最大值选择数据
n

data\u finale
的大小为:
172299*11*5
,我想找到一种比下面的循环更有效的方法来获取
data\u finale(ii,:,5)的最大值。


如果我做对了,你想根据矩阵的维数找到最大值,就像在XxYxZ矩阵中一样,你想沿着X,Y和Z的维数找到最大值。如果是这种情况,为什么不使用具有维度选择性的函数?您已经在使用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
我一直在看你提供的代码,我试图弄清楚你到底在做什么。代码是正确的吗?我有点困惑,你想从中找出什么

不管怎样

在第5个Z平面上使用max函数生成下面的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值。我们可以从for循环中删除
max
函数,留下数据部分。下面的代码显示了我的代码、你的代码和速度

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.

如果我做对了,你想根据矩阵的维数找到最大值,就像在XxYxZ矩阵中一样,你想沿着X,Y和Z的维数找到最大值。如果是这种情况,为什么不使用具有维度选择性的函数?您已经在使用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
我一直在看你提供的代码,我试图弄清楚你到底在做什么。代码是正确的吗?我有点困惑,你想从中找出什么

不管怎样

在第5个Z平面上使用max函数生成下面的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值。我们可以从for循环中删除
max
函数,留下数据部分。下面的代码显示了我的代码、你的代码和速度

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.

要提高效率,请删除
清除
。要提高效率,请删除
清除