获取矩阵的元素,这些元素大于行主要顺序中两个索引的总和

时间:2015-05-23 08:58:50

标签: arrays matlab for-loop matrix

我正在编写一个名为large_elements的函数,它接受一个名为X的数组,它是一个矩阵或向量。该函数标识X的那些大于其两个索引之和的元素。

例如,如果元素X(2,3)6,则会识别该元素,因为6 > (2 + 3)。函数的输出给出了行主要顺序中找到的此类元素的索引(行和列子)。它是一个只有两列的矩阵。第一列包含行索引,第二列包含相应的列索引。

这是一个例子,声明

indexes = large_elements([1 4; 5 2; 6 0]) 

应该给出如下输出:

[1 2; 2 1; 3 1]

如果不存在此类元素, 该函数返回一个 empty array

我想出了以下代码

function indexes = large_elements(A)
    [r c] = size(A);
    ind = 1;
    for ii = 1:r
        for jj = 1:c
            if A(ii,jj) > ii + jj
                indexes(ind,:) = [ii jj];
                ind = ind + 1;
            else
                indexes = [];
            end
       end  
    end
end

但结果不如预期。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用bsxfunfindind2sub

的一个矢量化approch
A = randi(8,5);    %// Your matrix

%// finding sum of the indexes for all elements
indSum = bsxfun(@plus, (1:size(A,1)).', 1:size(A,2));

%// generating a mask of which elements satisfies the given condition (i.e A > indSum)
%// Transposing the mask and finding corresponding indexes
[c,r] = find(bsxfun(@gt, A, indSum).') ;

%// getting the matrix by appending row subs and col subs
out = [r,c]

<强>结果:

输入A:

>> A

A =

 4     4     7     2     2
 1     3     4     8     3
 8     8     2     8     7
 8     3     4     5     1
 4     1     1     1     1

以行主顺序输出:

out =

 1     1
 1     2
 1     3
 2     4
 3     1
 3     2
 3     4
 4     1

注意:在行主要顺序中获取子目录非常棘手

这也是你正确的循环方法

[r, c] = size(A);
ind = 0;
indexes = [];
for ii = 1:r
    for jj = 1:c
        if A(ii,jj) > ii + jj
            ind = ind + 1;
            indexes(ind,:) = [ii jj];              
        end
   end  
end

答案 1 :(得分:0)

这是因为无论何时遇到小于其索引总和的元素,您都要将数组重新初始化为null。因此输出结果为null。您不应在null条件下将其初始化为else