从矩阵/向量中提取两个数字之间的元素



例如,我有一个 4x4 矩阵

   A = [1,    2,    3,    4;
        2,    1,    4,    3;
        1,    2,    4,    3;
        4,    1,    2,    3;];

对于每一行,我想提取 1 到 3 之间的元素(假设矩阵总是有一些介于 1 和 3 之间的元素,并且 1 总是在 3 之前)。例如,返回一个像 [{2}、{4}、{2,4}、{2}] 这样的单元格,甚至更好的是

矩阵
B=  [0,    1,    0,    0;
     0,    0,    0,    1;
     0,    1,    0,    1;
     0,    1,    0,    0;];

现在我正在为每一行做一个循环,找到 1 和 3 的索引,然后将它们之间的索引设置为零,即

    B = zeros(4,4);
    for i = 1 : size(A,1)
        ind1 = find(A(i,:) ==1);
        ind2 = find(A(i,:) ==3);
        B(i, A(i,ind1+1:ind2-1) ) = 1;
    end

有什么更简单的方法来生成这个矩阵B或只是单元格?任何建议不胜感激。

好的,这可能不是一个更简单的解决方案,但它确实删除了循环,所以它的计算速度应该更快:

这个想法不是试图找到 1 到 3 之间的数字并将它们设置为 1,而是我将找到 1 和 3 之外的数字并将其设置为 0:

B=zeros(4,4);
B(A == 1) = 1;
B(A == 3) = 1;
C = cumsum(B')';
B(C>=2) =1;
B(C< 1) =1;
%finally you want to invert this:
B = (B-1)*-1;
>> B =
 0     1     0     0
 0     0     1     0
 0     1     1     0
 0     0     1     0
===========

此部分适用于您的第二次编辑 =

=========
 D = A.*B % this seems to be the cell indexes you are after?
 D =
 0     2     0     0
 0     0     4     0
 0     2     4     0
 0     0     2     0
E = zeros(4,4);
for t = 1:size(A,1)
   E(t,D(t,D(t,:)>0)) = 1;  %This re-applies the index numbers and create a new index matrix through a loop........
   %or you can use E(t,D(t,~~D(t,:))) = 1 to same effect, Thanks to @Dev-iL
end

>> E =
 0     1     0     0
 0     0     0     1
 0     1     0     1
 0     1     0     0

这将为您提供 A 的 1 到 3 之间的元素索引,然后您可以使用逻辑索引来查找所需的单元格编号。

我的解决方案与已经建议的解决方案没有太大区别,但它有一个bsxfun,所以我说 - 为什么不呢? :)

function B = q38307616
A = [1,    2,    3,    4;
     2,    1,    4,    3;
     1,    2,    4,    3;
     4,    1,    2,    3;];
At = A.';
tmp = arrayfun(@colon,find(At==1)+1,find(At==3)-1,'UniformOutput',false);
% [tmp{:}] gives us the indices of the elements we should be considering
B = 0*A; %preallocation
for ind1 = 1: numel(tmp)
  B(ind1,:) = sum(bsxfun(@eq,At(tmp{ind1}).',1:4),1); %1:4 are the allowable values
end

"奖励":另一种获取每行 1 到 3 之间元素的逻辑映射的方法,与 GameOfThrowsB相同,是:

tmp2 = reshape(full(sparse(~~[tmp{:}],[tmp{:}],~~[tmp{:}],1,numel(A)).'),size(A));

相关内容

  • 没有找到相关文章

最新更新