簡體   English   中英

如何找到 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

您的示例和標題與問題文本不對應。 您的示例對一列中的所有值求和並將它們存儲在最小值的位置,標題也要求這樣做。 您可以通過巧妙地使用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

如果,另一方面,你是在問你的問題文本之后,隨后使用相同的sub2ind技巧在最小位置上減去A

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

這樣你就可以得到最小值以外的所有元素的總和。


要深入解釋sub2ind的作用,請閱讀Luis Mendo 撰寫的精彩 Q/A ,請記住,在A(2,3)中, 23稱為下標,在 3×4 矩陣的情況下, 轉化為線性指數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 包含該值第一次出現的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM