如何在MATLAB中找到每列的最小值并将该列的所有元素相加?

How to find minimum of each column in MATLAB and sum op all elements of that column?

提问人:user5618251 提问时间:11/25/2022 最后编辑:Adriaanuser5618251 更新时间:11/25/2022 访问量:44

问:

我有一个 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
MATLAB 矩阵

评论

0赞 Adriaan 11/25/2022
你的例子和你的问题的文本不对应,看我的回答。不过,两者都有类似的解决方案。

答:

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

另一方面,如果您追求问题文本所询问的内容,请随后使用相同的技巧减去最小位置:Asub2ind

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 矩阵的情况下,将其转换为线性索引sub2indA(2,3)238

我无法在我的 R2007b 上对此进行测试,但根据 min 上的文档,您可以使用它直接获取线性索引,而无需通过:[M, I] = min(A, [], 1, 'linear')Isub2ind

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 包含该值第一次出现的索引。