在Matlab

时间:2015-06-25 17:40:59

标签: matlab

考虑维度A的Matlab中的矩阵fxmxm,例如使用f=4m=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,ji=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]

2 个答案:

答案 0 :(得分:2)

您可以使用findind2subaccumarray的组合来解决此问题。

我们可以确定每个负值findind2sub的行,列和切片位置,获取将作为群组的行和列位置,并将作为我们的将密钥输入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;