我有变量矩阵:
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
答案 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的某些成员
,上述代码仍然有效