如何在matlab中找到行和列

时间:2016-09-07 08:35:08

标签: matlab matrix find

我有变量矩阵:

A = [1     2     8     8     1
     4     6     8     1     1
     5     3     1     1     8];

我有变量B:

B=[2 3 1 8 8];

问题是如何从变量B中查找变量A中的行和列(按行排序)。

示例,变量B中的第一个索引是2,然后我想在变量A中找到值2并获得第一行和第一列,然后下一个过程直到索引5,但是如果已经使用了行和列,那么得到第二个位置(例如指数4和5具有相同的值)。

rows;
columns;

结果是:

rows = 1 3 1 1 1
columns = 2 2 1 3 4

3 个答案:

答案 0 :(得分:0)

使用find。该函数可以返回线性索引或行/列索引。

使用线性索引可以解决方案

idx = zeros(size(B));
for i = 1:numel(B)
    % Find all indexes
    tmpIdx = find(A == B(i));
    % Remove those already used
    tmpIdx = setdiff(tmpIdx, idx);
    % Get the first new unique
    idx(i) = tmpIdx(1);
end
% Convert index to row and col
[rows, cols] = ind2sub(size(A),idx)

给予:

rows =  1 3 1 1 2
cols =  2 2 1 3 3

请注意,随着线性索引逐列下降,此处的结果与示例中的结果不同(尽管仍然是正确的索引)

rows = 1 3 1 1 1
columns= 2 2 1 3 4

但是为了得到这个,你可以转换A矩阵(A.')并翻转行和列(ind2sub的结果)

答案 1 :(得分:0)

这是我用于循环的解决方案,我试图优化迭代次数和计算成本。如果B和A之间没有对应的值,则row / col索引返回NaN。

[Bu,~,ord] = unique(B,'stable');

% Index of each different values
[col,row] = arrayfun(@(x) find(A'==x),Bu,'UniformOutput',0)

% For each value in vector B we search the first "non already used" corresponding value in A.
for i = 1:length(B)
    if ~isempty(row{ord(i)})
        r(i) = row{ord(i)}(1);
        row{ord(i)}(1) = [];
        c(i) = col{ord(i)}(1);
        col{ord(i)}(1) = [];
    else
        r(i) = NaN;
        c(i) = NaN;
    end
end

<强>结果:

c = [2   2   1   3   4]

r = [1   3   1   1   1]

答案 2 :(得分:0)

使用可以使用find和sub2ind来实现你想要的 但为此你必须转移你的第一个

 A = [1     2     8     8     1
     4     6     8     1     1
     5     3     1     1     8];
B= [2 3 1 8 8];
TMP = A.';
for i = 1:length(B)
   indx = find(TMP== B(i),1,'first')   %Finding the element of B present in A 
   if(~isempty(indx )) % If B(i)  is a member of A 
       [column(i),row(i)] = ind2sub(size(TMP),indx) % store it in row and column matrix
       TMP(indx) = nan; % remove that element
   end
end
  
    

column =

2     2     1     3     4
         

row =

1     3     1     1     1
  

正如在其中一篇评论中,Usama建议预先分配内存 你可以使用

来做到这一点
row = zeros(1,sum(ismember(B,A)))
column= zeros(1,sum(ismember(B,A)))

即使A中存在B的某些成员

,上述代码仍然有效