整数在向量

时间:2016-08-21 03:50:46

标签: matlab matrix indexing

我认为这个问题非常基本,但是一段时间后我仍然很忙。

让我们假设我们有一个包含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矩阵的每一行,我无法处理线性不足。

提前致谢!

3 个答案:

答案 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
     .     .
     .     .
     .     .

其中第一列是行,第二列是nA的每个实例的列。

对于所有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