我认为这个问题非常基本,但是一段时间后我仍然很忙。
让我们假设我们有一个包含4个随机重复整数的向量,如:
v = [ 1 3 3 3 4 2 1 2 3 4 3 2 1 4 3 3 4 2 2]
我正在搜索每个整数的所有位置的向量,例如对于1,它应该是一个像:
的向量position_one = [1 7 13]
由于我想搜索100x10000矩阵的每一行,我无法处理线性不足。
提前致谢!
答案 0 :(得分:0)
在矩阵中查找线性索引:I = find(A == 1)
在矩阵A中找到二维索引:[row, col] = find(A == 1)
。
%Create sample matrix, with elements equal one:
A = zeros(5, 4);
A([2 10 14]) = 1
A =
0 0 0 0
1 0 0 0
0 0 0 0
0 0 1 0
0 1 0 0
在A:
中找到线性索引find(A == 1)
ans =
2
10
14
%This is the same as reshaping A to a vector and find ones in the vector:
B = A(:);
find(B == 1);
B' =
0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
找到二维索引:
[row, col] = find(A == 1)
row =
2
5
4
col =
1
2
3
答案 1 :(得分:0)
行和列
由于每个整数的输出都会发生变化,因此单元格数组将适合整个任务。对于整个矩阵,您可以执行以下操作:
A = randi(4,10,30); % some data
Row = repmat((1:size(A,1)).',1,size(A,2)); % index of the row
Col = repmat((1:size(A,2)),size(A,1),1); % index of the column
pos = @(n) [Row(A==n) Col(A==n)]; % Anonymous function to find the indices of 'n'
比你可以写的每个n
:
>> pos(3)
ans =
1 1
2 1
5 1
6 1
9 1
8 2
3 3
. .
. .
. .
其中第一列是行,第二列是n
中A
的每个实例的列。
对于所有n
,您可以使用arrayfun
:
positions = arrayfun(pos,1:max(A(:)),'UniformOutput',false) % a loop that goes over all n's
或简单的for
循环(更快):
positions = cell(1,max(A(:)));
for n = 1:max(A(:))
positions(n) = {pos(n)};
end
两种情况下的输出都是一个单元格数组:
positions =
[70x2 double] [78x2 double] [76x2 double] [76x2 double]
并且对于每个n
,您可以编写positions{n}
,例如:
>> positions{1}
ans =
10 1
2 3
5 3
3 4
5 4
1 5
4 5
. .
. .
. .
仅限行
如果您想要在给定行和n
的列索引中找到所有内容,则可以这样写:
A = randi(4,10,30);
row_pos = @(k,n) A(k,:)==n;
positions = false(size(A,1),max(A(:)),size(A,2));
for n = 1:max(A(:))
positions(:,n,:) = row_pos(1:size(A,1),n);
end
现在,positions
是一个逻辑三维数组,每行对应A
中的一行,每列对应一个值n
,第三维是行和n
组合的存在向量。这样,我们可以将R
定义为列索引:
R = 1:size(A,2);
然后找到给定行和n
的相关位置。例如,第9行中n=3
的列索引为:
>> R(positions(9,3,:))
ans =
2 6 18 19 23 24 26 27
这就像调用find(A(9,:)==3)
一样,但如果你需要多次执行,找到所有索引并将它们存储在positions
(这是合乎逻辑的,所以它不是那么大)更快。
答案 2 :(得分:0)
您可以使用accumarray
anonymous function执行此操作,如下所示:
positions = accumarray(v(:), 1:numel(v), [], @(x) {sort(x.')});
有关
v = [ 1 3 3 3 4 2 1 2 3 4 3 2 1 4 3 3 4 2 2];
这给出了
positions{1} =
1 7 13
positions{2} =
6 8 12 18 19
positions{3} =
2 3 4 9 11 15 16
positions{4} =
5 10 14 17