例如,我有一个 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 之间元素的逻辑映射的方法,与 GameOfThrows 的B
相同,是:
tmp2 = reshape(full(sparse(~~[tmp{:}],[tmp{:}],~~[tmp{:}],1,numel(A)).'),size(A));