Matlab:用不包括自身的行的最小值替换矩阵中的元素
Matlab: replace element in matrix by the minimum of the row excluding itself
我想将每个元素替换为其所在行的最小值,而不是元素本身。
示例:输入In = [1 2 3; 4 5 6; 7 8 9]
,输出out = [2 1 1; 5 4 4; 8 7 7]
编辑:没有for
循环,除非计算效率更高
我通过两次调用 min
做到了这一点。你可以用 sort(In,2)
:
做类似的事情
% input matrix
In = [1 2 3; 4 5 6; 7 8 9];
% compute minimum for each row
[val,mincols] = min(In,[],2);
% generate matrix made of minimum value of each row
Out = repmat(val,[1 size(In,2)]);
% find indexes of minimum values
minrows = 1:size(In,1);
minidxs = sub2ind(size(In),minrows,mincols');
% replace minimum values with infs
In(minidxs) = inf;
% find next minimum values
val = min(In,[],2);
% set original minimum elements to next minimum values
Out(minidxs) = val
您可以使用 MATLAB R2016a 中引入的新函数 movmin
通过移动最小值来解决此问题:
In = [1 2 3; 4 5 6; 7 8 9]; % Sample data
C = size(In, 2); % Get the number of columns
out = movmin(In(:, [2:C 1:(C-1)]), [0 C-2], 2, 'Endpoints', 'discard')
out =
2 1 1
5 4 4
8 7 7
上面的工作是首先索引 In
的列以创建矩阵的环绕副本,然后沿着每一行滑动大小为 C-1
的 window,计算最低限度。 'Endpoints', 'discard'
选项丢弃 window 超出矩阵边缘的结果。
我想将每个元素替换为其所在行的最小值,而不是元素本身。
示例:输入In = [1 2 3; 4 5 6; 7 8 9]
,输出out = [2 1 1; 5 4 4; 8 7 7]
编辑:没有for
循环,除非计算效率更高
我通过两次调用 min
做到了这一点。你可以用 sort(In,2)
:
% input matrix
In = [1 2 3; 4 5 6; 7 8 9];
% compute minimum for each row
[val,mincols] = min(In,[],2);
% generate matrix made of minimum value of each row
Out = repmat(val,[1 size(In,2)]);
% find indexes of minimum values
minrows = 1:size(In,1);
minidxs = sub2ind(size(In),minrows,mincols');
% replace minimum values with infs
In(minidxs) = inf;
% find next minimum values
val = min(In,[],2);
% set original minimum elements to next minimum values
Out(minidxs) = val
您可以使用 MATLAB R2016a 中引入的新函数 movmin
通过移动最小值来解决此问题:
In = [1 2 3; 4 5 6; 7 8 9]; % Sample data
C = size(In, 2); % Get the number of columns
out = movmin(In(:, [2:C 1:(C-1)]), [0 C-2], 2, 'Endpoints', 'discard')
out =
2 1 1
5 4 4
8 7 7
上面的工作是首先索引 In
的列以创建矩阵的环绕副本,然后沿着每一行滑动大小为 C-1
的 window,计算最低限度。 'Endpoints', 'discard'
选项丢弃 window 超出矩阵边缘的结果。