考虑维度A
的Matlab中的矩阵fxmxm
,例如使用f=4
和m=3
A(:,:,1)=[1 2 3; 4 5 6; 7 8 9; 10 11 12]
A(:,:,2)=[0.5 2 -1; 3 -1 0; 7 -5 8; 10 11 12]
A(:,:,3)=[-2 2 -2; 2 -2 -1; 7 -5 -3; 10 -2 0]
A
的特征如下:考虑向量1xm
[A(i,j,1) A(i,j,2) ... A(i,j,m)]
。我们有A(i,j,1)>=A(i,j,2)>=...>=A(i,j,m)
。这适用于i,j
和i=1,...,f
的任何j=1,...,m
。
不使用循环,我想构建维B
的矩阵fxm
,以便B(i,j)
给出[A(i,j,1) A(i,j,2) ... A(i,j,m)]
中第一个负元素的索引。如果[A(i,j,1) A(i,j,2) ... A(i,j,m)]
中没有否定元素,B(i,j)
应该等于m+1
。
在上面的例子中
B=[3 4 2; 4 2 3; 4 2 3; 4 3 4]
答案 0 :(得分:2)
您可以使用find
,ind2sub
和accumarray
的组合来解决此问题。
我们可以确定每个负值find
和ind2sub
的行,列和切片位置,获取将作为群组的行和列位置,并将作为我们的将密钥输入accumarray
并使用负片的切片位置作为与每个密钥关联的值。对于每个唯一的行和列位置,我们确定最小的负片数。结果将是一个矩阵,其中每个位置将告诉您第一个切片为负片。
但是,对于那些非负的3D列,accumarray
将要做的是将这些位置设置为0.使用结果矩阵,任何值为0,将它们设置为m+1
:
ind = find(A < 0);
[rows, cols, slices] = ind2sub(size(A), ind);
B = accumarray([rows cols], slices, [size(A,1), size(A,2)], @min);
B(B == 0) = size(A,3) + 1;
对于您的示例,我们得到:
B =
3 4 2
4 2 3
4 2 3
4 3 4
答案 1 :(得分:1)
您可以使用max
的双输出形式在给定维度上充当“find
”,如下所示:
[v, B] = max(A<0, [], 3);
B(~v) = size(A,3)+1;