从 3D 矩阵变量切片时将 2D 矩阵展平为 1D 的最佳方法
Best way to flatten a 2D matrix to 1D when sliced from a 3D matrix variable
我在 Matlab 中有一个 3D 矩阵来存储一系列二维数组。我必须找到最大值及其行和列索引,这对于包含二维数组的单个变量来说非常简单,如
A = rand(10,10);
[m,i] = max(A(:));
[I,J] = ind2sub( size(A) , i )
问题是我不能对 3D 矩阵使用这种语法
A = rand(10,10,3);
[m,i] = max( A(:,:,1)(:) );
[I,J] = ind2sub(size( A(:,:,1) ), i )
Error: ()-indexing must appear last in an index expression.
我可以创建一个临时变量来存储 2D 切片,但我想我会看看是否有更好的方法来做到这一点,也许调用重塑?有没有办法在这种情况下使用简单的 linearizing/flattening 运算符 (:)
?
我会这样做:
[B i]=max(reshape(A,[],size(A,3)));
[II,JJ]=ind2sub(size(A),i );
唯一的限制是它不能很好地处理每个 2D 切片有多个最大值的情况。
您可以将其转换为元胞数组并使用 cellfun
B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]);
[M,I]= cellfun(@max,B)
[R,C] = ind2sub(size(A),I);
M
包含最大值和I
相应的索引。
假设 A
是一个 3x3x2
数组。
A =[
0.7952 0.4456 0.7547
0.1869 0.6463 0.2760
0.4898 0.7094 0.6797];
A(:,:,2) =[
0.6551 0.4984 0.5853
0.1626 0.9597 0.2238
0.1190 0.3404 0.7513];
将每个切片转换为 1x9x2
元胞数组
B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]);
B(:,:,1) =
[1x9 double]
B(:,:,2) =
[1x9 double]
取每个切片的最大值。 R
是行,C
是 M
中相应最大值的列。
[M,I]= cellfun(@max,B)
[R,C] = ind2sub(size(A),I)
R(:,:,1) =
1
R(:,:,2) =
2
C(:,:,1) =
1
C(:,:,2) =
2
连续取max会直接拉出指数(倒序):
A = rand(10,10,3);
[m,J] = max(max(A(:,:,1)));
[m,I] = max(A(:,J,1));
%检查:
A(I,J,1) == m
我在 Matlab 中有一个 3D 矩阵来存储一系列二维数组。我必须找到最大值及其行和列索引,这对于包含二维数组的单个变量来说非常简单,如
A = rand(10,10);
[m,i] = max(A(:));
[I,J] = ind2sub( size(A) , i )
问题是我不能对 3D 矩阵使用这种语法
A = rand(10,10,3);
[m,i] = max( A(:,:,1)(:) );
[I,J] = ind2sub(size( A(:,:,1) ), i )
Error: ()-indexing must appear last in an index expression.
我可以创建一个临时变量来存储 2D 切片,但我想我会看看是否有更好的方法来做到这一点,也许调用重塑?有没有办法在这种情况下使用简单的 linearizing/flattening 运算符 (:)
?
我会这样做:
[B i]=max(reshape(A,[],size(A,3)));
[II,JJ]=ind2sub(size(A),i );
唯一的限制是它不能很好地处理每个 2D 切片有多个最大值的情况。
您可以将其转换为元胞数组并使用 cellfun
B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]);
[M,I]= cellfun(@max,B)
[R,C] = ind2sub(size(A),I);
M
包含最大值和I
相应的索引。
假设 A
是一个 3x3x2
数组。
A =[
0.7952 0.4456 0.7547
0.1869 0.6463 0.2760
0.4898 0.7094 0.6797];
A(:,:,2) =[
0.6551 0.4984 0.5853
0.1626 0.9597 0.2238
0.1190 0.3404 0.7513];
将每个切片转换为 1x9x2
元胞数组
B=mat2cell(reshape(A,[1, size(A,2).^2, size(A,3)]),[1],[size(A,2).^2], [ones(size(A,3),1)]);
B(:,:,1) =
[1x9 double]
B(:,:,2) =
[1x9 double]
取每个切片的最大值。 R
是行,C
是 M
中相应最大值的列。
[M,I]= cellfun(@max,B)
[R,C] = ind2sub(size(A),I)
R(:,:,1) =
1
R(:,:,2) =
2
C(:,:,1) =
1
C(:,:,2) =
2
连续取max会直接拉出指数(倒序):
A = rand(10,10,3);
[m,J] = max(max(A(:,:,1)));
[m,I] = max(A(:,J,1));
%检查: A(I,J,1) == m