我有一个非常大的3D矩阵,我需要从这个大矩阵中调用一些特殊配置的特殊模式。例如,我需要一个子矩阵,它们的a,b,c,..,h元素与特定值相等(它不是模式匹配,但我需要一些具有特定值的模式)
有没有解决办法很快找到它们?我知道,一种解决方案是扫描矩阵并将其模式存储在数据库中,然后使用PCA来减小数据库的大小,但我正在寻找更准确的方法。
例如,假设我有一个矩阵,例如I:
I=[1 0 0 1 0 1 0 1 0
0 0 0 0 0 0 0 0 0
0 1 0 0 1 0 0 1 0
1 0 1 1 0 1 0 1 0
0 0 0 0 0 0 0 0 0
1 0 0 0 1 0 1 0 0
0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 1
0 0 1 0 0 0 0 1 0]
然后我有另一个矩阵如下:
p=[1 0 NaN NaN 1 NaN NaN NaN NaN]
然后,我应该在“I”中找到它们的列1,2和5分别等于1,0,1的行(在这个例子中,6行是正确的行。但是,在事实上,我的矩阵(I)的大小是非常巨大的(超过十亿),如果我使用循环来找到那些行,它需要很多时间。我正在寻找一个快速的代码或方法。希望它是有意义的现在!
答案 0 :(得分:1)
如果您要查找的模式是列式的,则可以执行以下操作: (如果不是请在你的问题中更具体,我会修改我的答案)
A=randi(10,[11 12 13]); %%% your matrix
p=[2;3;4]; %%% your pattern
m=cell(1,numel(p));
% for each element of the pattern
for i=1:numel(p)
% find the element of A matching the i-th element of p
m{i}=find(A==p(i));
% convert to indices
[x y z]=ind2sub(size(A),m{i});
m{i}=[x y z];
% convert to the position of the first element of the pattern
m{i}(:,1)=m{i}(:,1)-(i-1);
% remove when it goes below zero
m{i}(m{i}(:,1)<=0,:)=[];
end
% accumulate everything to find out where all the elements of the pattern match
numberOfMatching=accumarray(vertcat(m{:}),1,size(A));
fullMatchingIndices=find(numberOfMatching==numel(p));
% convert to sub=indices
[x y z]=ind2sub(size(A),fullMatchingIndices);
finalIndices=[x y z];
% check the result
if ~isempty(finalIndices)
A(finalIndices(1,1)+(0:numel(p)-1),finalIndices(1,2),finalIndices(1,3))
end
因此,您应该获得模式p(如果至少有一个匹配是foud):
ans =
2
3
4