簡體   English   中英

使用Matlab查找矩陣中相等元素的位置

[英]Find the position of equal elements in a matrix using Matlab

假設我有:

m = [1,2,3;1,4,5;6,4,7]

我想得到一個包含矩陣m元素位置的列表,以便將相等元素的位置分組在一起。 矩陣m的輸出必須為:

{{1,1},{2,1}},{{2,2},{3,2}},{1,2},{1,3},{2,3},{3,1},{3,3}
%     1             2         3     4     5     6     7

我們在這里可以看到,彼此相等的元素的位置被分組在一起。

最簡單的方法是遍歷每個唯一值並確定與每個值匹配的行和列位置。 這樣的事情可能會起作用:

val = unique(m);
pos = cell(1, numel(val));
for ii = 1 : numel(val)
    [r,c] = find(m == val(ii));
    pos{ii} = [r,c];
end

pos是一個單元格數組,其中包含每個唯一值的所有位置。 我們可以通過以下方式顯示這些職位:

>> format compact; celldisp(pos)
pos{1} =
     1     1
     2     1
pos{2} =
     1     2
pos{3} =
     1     3
pos{4} =
     2     2
     3     2
pos{5} =
     2     3
pos{6} =
     3     1
pos{7} =
     3     3

除非您明確顯示每組頭寸的每個唯一值,否則這當然沒有意義。 因此,我們可以嘗試使用類似的方法,其中我們可以遍歷單元格數組中的每個元素,並顯示每個位置集所屬的對應元素:

 for ii = 1 : numel(val)
     fprintf('Value: %f\n', val(ii));
     fprintf('Positions:\n');
     disp(pos{ii});
 end

我現在得到的是:

Value: 1.000000
Positions:
     1     1
     2     1
Value: 2.000000
Positions:
     1     2
Value: 3.000000
Positions:
     1     3
Value: 4.000000
Positions:
     2     2
     3     2
Value: 5.000000
Positions:
     2     3
Value: 6.000000
Positions:
     3     1
Value: 7.000000
Positions:
     3     3

這將為您提供所需的內容,唯一的事實是唯一元素的索引也會在單元格中包裝兩次,就像重復元素的索引一樣:

m = [1,2,3;1,4,5;6,4,7];

[~, idx] = ismember(m(:), unique(m(:)));
linInd = 1:numel(m);
[i,j] = ind2sub(size(m), linInd);
res = accumarray(idx, linInd, [], @(x) {num2cell([i(x);j(x)]',2)});

結果:

>> celldisp(res)

res{1}{1} =
     2     1
res{1}{2} =
     1     1
res{2}{1} =
     1     2
res{3}{1} =
     1     3
res{4}{1} =
     2     2
res{4}{2} =
     3     2
res{5}{1} =
     2     3
res{6}{1} =
     3     1
res{7}{1} =
     3     3

暫無
暫無

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

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