提问人:user5618251 提问时间:11/25/2022 最后编辑:Adriaanuser5618251 更新时间:11/25/2022 访问量:44
如何在MATLAB中找到每列的最小值并将该列的所有元素相加?
How to find minimum of each column in MATLAB and sum op all elements of that column?
问:
我有一个 300x178 的矩阵,我想找到该矩阵中每列的最小值,即产生一个 1x178 数组。然后,我想将 300x178 矩阵中每列中除最小值之外的所有元素的总和存储在最小值的位置/像素上,将所有其他元素保留为零。如何使用 MATLAB 做到这一点?
例:
1 4 6 3
2 6 7 4
5 1 5 7
成为:
1 0 0 1
0 0 0 0
0 1 1 0
最终:
8 0 0 14
0 0 0 0
0 11 18 0
答:
3赞
Adriaan
11/25/2022
#1
您的示例和标题与问题文本不符。您的示例将列中的所有值相加,并将它们存储在最小值的位置,标题也要求这样做。你可以通过巧妙地利用 sub2ind
来做到这一点:
A = [1 4 6 3
2 6 7 4
5 1 5 7];
C = zeros(size(A));
[tmp, idx] = min(A); % find the locations of minima
% one liner to store the sum of columns
C(sub2ind(size(A), idx, 1:size(A,2))) = sum(A,1);
C =
8 0 0 14
0 0 0 0
0 11 18 0
另一方面,如果您追求问题文本所询问的内容,请随后使用相同的技巧减去最小位置:A
sub2ind
C(sub2ind(size(A), idx, 1:size(A,2))) = C(sub2ind(size(A), idx, 1:size(A,2))) - A(sub2ind(size(A), idx, 1:size(A,2)))
C =
7 0 0 11
0 0 0 0
0 10 13 0
这样,您可以获得除最小元素之外的所有元素的总和。
有关其作用的深入解释,请阅读 Luis Mendo 的这本精彩的问答,请记住,在 和 中称为下标,在 3×4 矩阵的情况下,将其转换为线性索引。sub2ind
A(2,3)
2
3
8
我无法在我的 R2007b 上对此进行测试,但根据 min
上的文档,您可以使用它直接获取线性索引,而无需通过:[M, I] = min(A, [], 1, 'linear')
I
sub2ind
C = zeros(size(A));
[tmp, idx] = min(A, [], 1, 'linear');
C(idx) = sum(A, 1);
% Optional, to sum all but the minimum
C(idx) = C(idx) - A(idx);
文档中关于原始矩阵中出现多个相同值最小值的小值的小说明:
如果最小的元素多次出现,则 I 包含该值第一次出现的索引。
评论